Что может снизить производительность MySqls? - PullRequest
5 голосов
/ 25 октября 2011

В целом мы очень довольны производительностью Mysqls, аналогичные запросы выполняются за доли секунды.Теперь мы столкнулись с проблемой этого запроса

SELECT dc.id,dmr.art_id 
FROM dmr 
JOIN dma ON dma.id = dmr.dml_id
JOIN dc  ON  dc.id = dma.dc_id
WHERE  dmr.art_id = 2285

Для получения 5021 строки требуется 50 секунд.Отсутствие индекса, вероятно, является наиболее распространенной причиной подобных проблем.Поэтому я предшествовал запросу EXPLAIN и получил этот план запроса, который показывает, что используются только индексы, а не последовательное сканирование.

В таблицах dmr и dma по 3 миллиона строк каждая, в dc 6000 строк.

+----+-------------+-------+--------+-------------------------------+----------------+---------+--------------------+------+-------------+
| id | select_type | table | type   | possible_keys                 | key            | key_len | ref                | rows | Extra       |
+----+-------------+-------+--------+-------------------------------+----------------+---------+--------------------+------+-------------+
|  1 | SIMPLE      | dmr   | ref    | FKC33D5199F17E1825,ix_art_ref | ix_art_ref     | 5       | const              | 5021 | Using where |
|  1 | SIMPLE      | dma   | eq_ref | PRIMARY,FK8C6E1445153BBDC9    | PRIMARY        | 8       | dev.dmr.dml_id     |    1 |             |
|  1 | SIMPLE      | dc    | eq_ref | PRIMARY                       | PRIMARY        | 8       | dev.dma.dc_id      |    1 | Using index |
+----+-------------+-------+--------+-------------------------------+----------------+---------+--------------------+------+-------------+

Что может вызвать эти проблемы?

Версия MySql 5.5 с использованием InnoDB в качестве движка.(Только параметры по умолчанию для окон).

EDIT

Когда я удаляю предложение where, mysql немедленно возвращает (огромный) набор результатов.План запроса в этом случае выглядит так:

+----+-------------+-------+-------+----------------------------+--------------------+---------+------------+------+--------------------------+
| id | select_type | table | type  | possible_keys              | key                | key_len | ref        | rows | Extra                    |
+----+-------------+-------+-------+----------------------------+--------------------+---------+------------+------+--------------------------+
|  1 | SIMPLE      | dc    | index | PRIMARY                    | FKAEB144C64FA71464 | 9       | NULL       | 4037 | Using index              |
|  1 | SIMPLE      | dma   | ref   | PRIMARY,FK8C6E1445153BBDC9 | FK8C6E1445153BBDC9 | 9       | dev.dc.id  |  263 | Using where; Using index |
|  1 | SIMPLE      | dmr   | ref   | FKC33D5199F17E1825         | FKC33D5199F17E1825 | 9       | dev.dma.id |    1 | Using where              |
+----+-------------+-------+-------+----------------------------+--------------------+---------+------------+------+--------------------------+

Ответы [ 2 ]

1 голос
/ 25 октября 2011

Может быть таблицы очень фрагментированы, и MySQL должен пройти по всему диску, чтобы получить эти 5021 строки?

0 голосов
/ 25 октября 2011

Я решил проблему путем переустановки mysql 5.5.17 и решил не использовать настройку «Машина разработчика», я использовал настройки по умолчанию для «Сервер машины».После этого запрос выполняется через несколько секунд (в первый раз), последующий запрос выполняется намного лучше.

Я полагаю, что в режиме разработчика mysql настроен на сохранение памяти и не буферизует достаточное количество страниц индекса для больших таблиц.

(Пере) настройку можно выполнить с помощью MYSQL_HOME/bin/MySQLInstanceConfig

enter image description here

Сравнение старых и новых файлов конфигурации показывает, что эти значения были изменены во времяКонфигурация:

tmp_table_size=103M old 18M
myisam_sort_buffer_size=205M old 35M
key_buffer_size=175M old 25M
innodb_additional_mem_pool_size=7M old 3499K
innodb_additional_mem_pool_size=2M old 1M
innodb_buffer_pool_size=339M old 47M
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...