MySQL Slow-запрос для 'COUNT'
Следующий запрос занимает 0,7 с на двухъядерной Windows Server 2008 R2 Enterprise с частотой 2,5 ГГц при работе с базой данных MySql 4,5 Гб. sIndex10
тип столбца varchar(1024):
SELECT COUNT(*) FROM e_entity
WHERE meta_oid=336799 AND sIndex10 = ''
EXPLAIN
показывает следующую информацию:
id: 1
select_type: SIMPLE
table: e_entity
type: ref
possible_keys: App_Parent,sIndex10
key: App_Parent
key_len: 4
ref: const
rows: 270066
extra: Using Where
230060 строк соответствуют первому условию, а 124216 строк соответствуют предложению с AND
оператор. meta_oid
индексируется, и хотя sIndex10
также проиндексирован, я думаю, что это правильно, не поднимая этот индекс как FORCE INDEX (sIndex10)
, занимает больше времени. Мы рассмотрели параметры конфигурации, такие как innodb_buffer_pool_size
и они выглядят правильно.
Учитывая, что в этой таблице уже 642532 записей, достигли ли мы максимальной производительности, которую может предложить mysql? Является ли на данный момент инвестирование в оборудование единственным способом продвижения вперед?
2 ответа
WHERE meta_oid=336799 AND sIndex10 = ''
просит составного индекса
INDEX(meta_oid, sIndex10) -- in either order
Это не то же самое, что иметь отдельные индексы для столбцов.
Это все, что нужно сделать.
Одна вещь, которую я всегда делаю, это просто count(id)
поскольку id
(почти) всегда индексируется, считая только идентификатор, нужно только взглянуть на индекс.
Так что попробуйте запустить и посмотреть, работает ли он лучше. Вы также должны добавить SQL_NO_CACHE
при тестировании, чтобы получить лучшее представление о том, как выполняется запрос.
SELECT SQL_NO_CACHE COUNT(id) FROM e_entity
WHERE meta_oid=336799 AND sIndex10 = ''
Примечание. Вероятно, это не полный ответ на ваш вопрос, но он был слишком длинным для простого комментария.