Como reduzir o disco do mysql io?

2
mysql> explain SELECT *
    -> FROM ('items')
    -> WHERE 'states' = 'A'
    -> ORDER BY 'updated_date' desc
    -> LIMIT 20520, 40;
+----+-------------+--------+--------+----------------------------+---------------------+---------+----------+-------+-------------+
| id | select_type | table  | type   | possible_keys              | key                 | key_len | ref      | rows  | Extra       |
+----+-------------+--------+--------+----------------------------+---------------------+---------+----------+-------+-------------+
|  1 | SIMPLE      | items  | ref    | states_updated_date,states | states_updated_date | 6       | const    | 19040 | Using where |
+----+-------------+--------+--------+----------------------------+---------------------+---------+----------+-------+-------------+


    mysql> describe items;
+---------------------+--------------+------+-----+---------+----------------+
| Field               | Type         | Null | Key | Default | Extra          |
+---------------------+--------------+------+-----+---------+----------------+
| id                  | int(11)      | NO   | PRI | NULL    | auto_increment |
| url                 | varchar(255) | NO   | UNI | NULL    |                |
| vendor              | varchar(255) | NO   |     | NULL    |                |
| title               | varchar(255) | NO   |     | NULL    |                |
| price               | int(11)      | YES  |     | NULL    |                |
| contact_seller_link | varchar(255) | NO   |     | NULL    |                |
| seller              | varchar(255) | NO   |     | NULL    |                |
| query_count         | varchar(7)   | NO   |     | NULL    |                |
| warrenty            | varchar(63)  | NO   |     | NULL    |                |
| created_date        | varchar(63)  | NO   |     | NULL    |                |
| notes_count         | varchar(7)   | NO   |     | NULL    |                |
| views_count         | varchar(7)   | NO   |     | NULL    |                |
| effective_date      | varchar(63)  | NO   |     | NULL    |                |
| updated_date        | varchar(63)  | NO   | MUL | NULL    |                |
| images              | text         | NO   |     | NULL    |                |
| description         | text         | NO   |     | NULL    |                |
| extra_comment       | text         | NO   |     | NULL    |                |
| queries             | text         | NO   |     | NULL    |                |
| crawl_date          | datetime     | NO   |     | NULL    |                |
| brand               | varchar(63)  | NO   | MUL | NULL    |                |
| states              | varchar(1)   | YES  | MUL | NULL    |                |
| focal_length_id     | int(9)       | YES  | MUL | NULL    |                |
+---------------------+--------------+------+-----+---------+----------------+

mysql> show index from items;;
+-------+------------+------------------------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name               | Seq_in_index | Column_name     | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+-------+------------+------------------------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+
| items |          0 | PRIMARY                |            1 | id              | A         |      124498 |     NULL | NULL   |      | BTREE      |         |
| items |          0 | url                    |            1 | url             | A         |      124498 |     NULL | NULL   |      | BTREE      |         |
| items |          1 | focal_length_id        |            1 | focal_length_id | A         |         669 |     NULL | NULL   | YES  | BTREE      |         |
| items |          1 | focal_length_id_states |            1 | focal_length_id | A         |         308 |     NULL | NULL   | YES  | BTREE      |         |
| items |          1 | focal_length_id_states |            2 | states          | A         |         604 |     NULL | NULL   | YES  | BTREE      |         |
| items |          1 | brand                  |            1 | brand           | A         |          26 |     NULL | NULL   |      | BTREE      |         |
| items |          1 | updated_date           |            1 | updated_date    | A         |      124498 |     NULL | NULL   |      | BTREE      |         |
| items |          1 | states_updated_date    |            1 | states          | A         |           4 |     NULL | NULL   | YES  | BTREE      |         |
| items |          1 | states_updated_date    |            2 | updated_date    | A         |      124498 |     NULL | NULL   |      | BTREE      |         |
| items |          1 | states                 |            1 | states          | A         |          10 |     NULL | NULL   | YES  | BTREE      |         |
+-------+------------+------------------------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+
10 rows in set (0.13 sec)

ele está trabalhando em 19k linhas por consulta, conjunto de dados em torno de 40k. Eu posso melhorar isso adicionando o índice? ou aumentar o ram usado meu mysql?

    
por joetsuihk 03.05.2011 / 18:02

4 respostas

2

O carregamento do MySQL para SELECTs deve ser limitado pela CPU e não pela I / O. Se estiver com E / S, então você deve:

  • adicione índices quando apropriado
  • otimizar consultas
  • aumenta a memória usada para armazenar em cache as tabelas e as consultas - verifique a taxa de acertos do cache. O MySQL Tuner pode ajudá-lo nessa tarefa.
por 03.05.2011 / 18:18
2

O índice que você precisa criar é fornecido nas cláusulas WHERE e ORDER BY, estados e data_atualizada

ALTER TABLE items ADD INDEX states_updated_date_ndx (states,updated_date);

Execute novamente o seu plano EXPLAIN depois.

Você também pode reduzir o tamanho das colunas executando PROCEDURE ANALYZE () assim:

SELECT states,updated_date FROM items PROCEDURE ANALYSE();

Isso não mostrará todas as linhas. Ele simplesmente passará por todas as linhas e determinará os tipos de dados ideais para os estados e as colunas atualizadas.

Se a tabela items for MyISAM, você terá que aumentar key_buffer_size. Se InnoDB, aumente innodb_buffer_pool_size. No mínimo, certifique-se de que caches já são grandes o suficiente .

Experimente!

    
por 04.05.2011 / 16:27
0

Você pode reduzir o tamanho do seu índice alterando a coluna states para CHAR (1). Índices menores se encaixam melhor na memória.

    
por 04.05.2011 / 16:22
0

Nem pense em desempenho sem índices ou chaves.

    
por 04.05.2011 / 16:26