2016-10-05 2 views
-1

У меня есть база данных с ~ 15 миллионами записей.База данных MySQL - Миллион записей - Производительность

Вот его структура:

enter image description here

SELECT count(*) FROM hash.list; ~ 77 seconds 
SELECT * FROM hash.list where plain = "aaaa"; ~~ 94 seconds 

Как я могу сделать это быстрее ~ 5 секунд или что еще?

+0

Как этот вопрос связан с PHP и md5? Я бы также рекомендовал вам опубликовать этот вопрос в http://dba.stackexchange.com/. –

+0

Используйте индексы! С индексом на 'plain' (например,' alter table hash.list add index (plain (30)) ', phpmyadmin не делает это для вас для типа' text'), ваш второй запрос должен понадобиться всего миллисекунды. Это не улучшит 'count (*)'. 77s кажется много для 15 миллионов строк с первичным ключом int, он должен быть больше в районе 2-4 секунд и показывает производительность чтения с вашего hdd ~ 0,8 мб/с. Возможно, вы делаете много других вещей на hdd или других пользователях, например. общий хостинг. Вы можете только улучшить это, улучшив общую производительность системы (особенно быстрее hdd или больше). – Solarflare

ответ

1

1. Идекс, я думаю, что вы сделали 2. Сделайте раздел этой таблицы и получите только записи, которые подпадают под ваши критерии. 3. Также choos Объясните, чтобы получить то, что занимает больше времени в вашем запросе.

+0

'PARTITION' не поможет; используйте индекс. –

0

Некоторые предложения:

  • Добавить индексов. Сначала добавьте кластеризованный индекс: https://dev.mysql.com/doc/refman/5.7/en/innodb-index-types.html, а затем добавьте вторичные индексы на то, что вам нужно найти, например, ваш plain.
  • Купить больше памяти. Очевидно, что ваш запрос count (*) основан на диске, так как 1.5G/20MB/sec ~ = 75 секунд.
  • Используйте оценки и ярлыки, если сможете. Например. примеры здесь, как получить счет (*) для всей таблицы очень быстро: How to optimize COUNT(*) performance on InnoDB by using index