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 = ''

Примечание. Вероятно, это не полный ответ на ваш вопрос, но он был слишком длинным для простого комментария.

Другие вопросы по тегам