Считаются ли более высокие строки в объяснении mysql хорошими или плохими?

У меня есть одна старая таблица MyISAM, где, когда я отправляю запрос на подсчет, таблица блокируется. Если я делаю тот же запрос в той же таблице InnoDB, запрос выполняется быстро. Проблема в том, что старая таблица MyISAM все еще используется в продакшене и находится под большой нагрузкой, а новая — нет.

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

Вот запрос, который я выполняю в обеих таблицах:

SELECT COUNT(*)
FROM table
WHERE vrsta_dokumenta = 3
    AND dostupnost = 0

Вот объяснение из старой таблицы MyISAM:

id select_type table     type possible_keys         key               key_len ref    rows   Extra    
1  SIMPLE     old_table  ref idx_vrsta_dokumenta idx_vrsta_dokumenta     1   const 564253  Using where 

А вот объяснение из новой таблицы InnoDB:

id select_type   table  type    possible_keys         key           key_len  ref    rows   Extra     
1  SIMPLE      new_table ref idx_vrsta_dokumenta idx_vrsta_dokumenta   1    const 611905 Using where

Как видите, количество строк в новой таблице больше, чем в старой.

Итак, в случае, если большее число является плохим, означает ли это, что запрос к новой таблице будет выполняться медленнее после того, как она будет полностью использована?

В случае, если более высокое число является хорошим, то, возможно, это является причиной того, что новая таблица работает быстрее, и MyISAM блокируется после некоторого времени выполнения.

В любом случае, что правильно? Что означает количество этих строк?

РЕДАКТИРОВАТЬ: в старой таблице столбцов в два раза больше, чем в новой. Так как старый был разделен на 2 таблицы.


person black-room-boy    schedule 07.10.2015    source источник
comment
Пожалуйста, предоставьте также структуры таблиц. Какие столбцы были проиндексированы. Индексируются ли столбцы в предложении WHERE или нет?   -  person hjpotter92    schedule 07.10.2015
comment
Сколько всего строк в таблице? Сколько возвращает COUNT?   -  person user4035    schedule 07.10.2015
comment
@hjpotter92 - я не могу предоставить полные структуры таблиц, они закрыты для публики. Первый столбец в предложении WHERE индексируется, второй — нет. Оба столбца являются крошечными.   -  person black-room-boy    schedule 07.10.2015
comment
@ user4035 - В каждой таблице около 1,2 миллиона строк. В InnoDB счетчик возвращает: 229626 , в старом MyISAM я не знаю, запрос выполняется очень долго, и таблица блокируется.   -  person black-room-boy    schedule 07.10.2015


Ответы (2)


мальчик из черной комнаты:

Итак, в случае, если большее число является плохим, означает ли это, что запрос к новой таблице будет выполняться медленнее после того, как она будет полностью использована?

В руководстве по MySQL говорится о столбце rows в EXPLAIN :

Столбец rows указывает количество строк, которые, по мнению MySQL, необходимо изучить для выполнения запроса.

Для таблиц InnoDB это число является приблизительным и не всегда может быть точным.

Итак, большее число — это неплохо, это всего лишь предположение, основанное на метаданных таблицы.

мальчик из черной комнаты:

В случае, если более высокое число является хорошим, то, возможно, это является причиной того, что новая таблица работает быстрее, и MyISAM блокируется после некоторого времени выполнения.

Большее число нехорошо. MyISAM блокируется не из-за этого номера.

Вручную:

MySQL использует блокировку на уровне таблиц для MyISAM, позволяя только одному сеансу обновлять эти таблицы за раз, что делает их более подходящими для приложений только для чтения, преимущественно для чтения или однопользовательских приложений.

... Обновления таблицы имеют более высокий приоритет, чем извлечение таблицы... Если у вас есть много обновлений для таблицы, операторы SELECT ждут, пока обновлений больше не будет.

Если ваша таблица часто обновляется, она блокируется операторами INSERT, UPDATE и DELETE (также известными как DML), что блокирует ваш запрос SELECT.

person user4035    schedule 07.10.2015
comment
Спасибо за ответ, и да, похоже, что обновление блокировало мой выбор. Я предполагаю, что InnoDB будет значительным улучшением. - person black-room-boy; 07.10.2015

Количество строк говорит вам, сколько строк MySQL должен был проверить, чтобы получить результат для вашего запроса. В этом помогают индексы, и очень большую роль играет число, называемое мощность индекса. Индексы помогают MySQL сократить количество проверок строк, поэтому чем меньше она делает, тем быстрее она работает. Поскольку есть много строк, которые удовлетворяют вашему условию vrsta_dokumenta = 3 AND dostupnost = 0, MySQL просто должен пройти через них, найти их и увеличить счетчик. Для MyISAM это означает, что MySQL должен считывать данные с диска — это дорого, потому что доступ к диску очень медленный. Для InnoDB это очень быстро, потому что InnoDB может хранить свой рабочий набор данных в памяти. Другими словами, MyISAM читает с диска, а InnoDB читает из памяти. Доступны и другие оптимизации, но общее правило заключается в том, что InnoDB будет быстрее, чем MyISAM, даже с ростом таблицы.

person Mjh    schedule 07.10.2015