One of the most basic optimizations is to design your tables to take as little space on the disk as possible. This can give huge improvements because disk reads are faster, and smaller tables normally require less main memory while their contents are being actively processed during query execution. Indexing also is a lesser resource burden if done on smaller columns.
MySQL supports a lot of different table types and row formats. For each table, you can decide which storage/index method to use. Choosing the right table format for your application may give you a big performance gain. See Capítulo 14, Motores de almacenamiento de MySQL y tipos de tablas.
You can get better performance on a table and minimize storage space using the techniques listed here:
Use the most efficient (smallest) data types possible. MySQL has many specialized types that save disk space and memory.
            Use the smaller integer types if possible to get smaller
            tables. For example, MEDIUMINT is often a
            better choice than INT since a
            MEDIUMINT column uses 25% less space.
          
            Declare columns to be NOT NULL if
            possible. It makes everything faster and you save one bit
            per column. If you really need NULL in
            your application, you should definitely use it. Just avoid
            having it on all columns by default.
          
            For MyISAM tables, if you do not have any
            variable-length columns (VARCHAR,
            TEXT, or BLOB
            columns), a fixed-size record format is used. This is faster
            but unfortunately may waste some space. See
            Sección 14.1.3, “Formatos de almacenamiento de tablas MyISAM”. You can hint that
            you want to have fixed length rows even if you have
            VARCHAR columns with the
            CREATE option
            ROW_FORMAT=fixed.
          
            Starting with MySQL/InnoDB 5.0.3, InnoDB
            tables use a more compact storage format. In earlier
            versions of MySQL, InnoDB records contain some redundant
            information, such as the number of columns and the length of
            each column, even for fixed-size columns. By default, tables
            are created in the compact format
            (ROW_FORMAT=COMPACT). If you wish to
            downgrade to older versions of MySQL/InnoDB, you can request
            the old format with ROW_FORMAT=REDUNDANT.
          
            The compact InnoDB format also changes the way how
            CHAR columns containing UTF-8 data are
            stored. In the ROW_FORMAT=REDUNDANT
            format, a UTF-8
            CHAR(
            occupies 3*n)n bytes, given that
            the maximum length of a UTF-8 encoded character is 3 bytes.
            Since many languages can be written mostly with single-byte
            UTF-8 characters, a fixed storage length often wastes space.
            The ROW_FORMAT=COMPACT format allocates a
            variable amount of
            n..3*n
            bytes for these columns by stripping trailing spaces if
            necessary. The minimum storage length is kept as
            n bytes in order to facilitate
            in-place updates in typical cases.
          
The primary index of a table should be as short as possible. This makes identification of each row easy and efficient.
Create only the indexes that you really need. Indexes are good for retrieval but bad when you need to store data quickly. If you access a table mostly by searching on a combination of columns, make an index on them. The first index part should be the most used column. If you always use many columns when selecting from the table, you should use the column with more duplicates first to obtain better compression of the index.
If it is very likely that a column has a unique prefix on the first number of characters, it is better to index only this prefix. MySQL supports an index on the leftmost part of a character column. Shorter indexes are faster not only because they take less disk space, but also because they give you more hits in the index cache and thus fewer disk seeks. See Sección 7.5.2, “Afinar parámetros del servidor”.
In some circumstances, it can be beneficial to split into two a table that is scanned very often. This is especially true if it is a dynamic format table and it is possible to use a smaller static format table that can be used to find the relevant rows when scanning the table.
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.

