Показатель Mysql на таблице в 6 миллионов строк
В один прекрасный день я подозреваю, что мне придется изучить хаоп и перенести все эти данные в неструктурированную базу данных, но я удивлен, обнаружив, что производительность настолько значительно ухудшилась за такой короткий промежуток времени.
У меня есть таблица mysql с менее чем 6 миллионами строк.
Я делаю очень простой запрос в этой таблице и считаю, что у меня есть все правильные индексы.
запрос
SELECT date, time FROM events WHERE venid='47975' AND date>='2009-07-11' ORDER BY date
объяснение возвращает
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE updateshows range date_idx date_idx 7 NULL 648997 Using where
поэтому я использую правильный индекс, насколько я могу судить, но этот запрос занимает 11 секунд.
База данных - MyISAM, а phpMyAdmin говорит, что таблица 1.0GiB.
Какие-нибудь идеи здесь?
Отредактировано:
Date_idx - это индексы как столбцов даты, так и венеда. Должны ли они быть двумя отдельными индексами?
Ответы
Ответ 1
Что вы хотите убедиться, что запрос будет использовать ТОЛЬКО индекс, поэтому убедитесь, что индекс охватывает все выбранные вами поля. Кроме того, поскольку это запрос диапазона, вам нужно иметь венед сначала в индексе, так как он запрашивается как константа. Поэтому я создавал и индексировал бы так:
ALTER TABLE events ADD INDEX indexNameHere (venid, date, time);
С помощью этого индекса вся информация, необходимая для заполнения запроса, указана в индексе. Это означает, что, надеюсь, механизм хранения способен извлекать информацию без фактического поиска внутри самой таблицы. Однако MyISAM, возможно, не сможет этого сделать, поскольку он не хранит данные в листах индексов, поэтому вы можете не получить желаемого увеличения скорости. В этом случае попытайтесь создать копию таблицы и используйте механизм InnoDB на копии. Повторите те же шаги там и посмотрите, если вы получите значительное увеличение скорости. InnoDB выполняет сохранение значений полей в листьях индекса и позволяет охватить индексы.
Теперь, надеюсь, после объяснения запроса вы увидите следующее:
mysql> EXPLAIN SELECT date, time FROM events WHERE venid='47975' AND date>='2009-07-11' ORDER BY date;
id select_type table type possible_keys key [..] Extra
1 SIMPLE events range date_idx, indexNameHere indexNameHere Using index, Using where
Ответ 2
Попробуйте добавить ключ, который охватывает венед и дату (или наоборот) или
Ответ 3
Я бы предположил, что таблица строк в 6М должна быть оптимизирована с помощью обычных методов.
Я предполагаю, что у вас есть выделенный сервер базы данных, и он имеет разумное количество бара (например, минимум 8G).
Вы хотите, чтобы вы настроили mysql, чтобы эффективно использовать ваш баран. Если вы используете 32-разрядную ОС, не делайте этого. Если вы используете MyISAM, настройте свой буфер ключей, чтобы использовать показатель signficiant, но не слишком много, вашего бара.
В любом случае вы хотите выполнить повторное тестирование производительности на оборудовании производственного класса.
Ответ 4
Попробуйте поместить индекс в столбец venid
.