#mysql #sql
#mysql #sql
Вопрос:
Мне нужно получить количество заказов за день (поле «time» — это временная метка java, а таблица «order» содержит 1 000 000 записей), я использую:
select count(*) from `order` where `time`>1307894400000 amp;amp; `time`<1307980799999
этот sql использовал 540 мс
Я попытался создать индекс, используя поле «time», но все еще требуется 390 мс
как мне оптимизировать этот оператор sql?
Комментарии:
1. Сколько строк в базе данных и сколько выбрано?
2. посмотрите, что объясняет выбор count (*) из
order
wheretime
>1307894400000 amp;amp;time
<1307980799999 outpot3. У вас уже есть индекс в
time
столбце. Это самая важная вещь. Если вы изменитеcount(*)
наcount(name-of-your-primary-key-column)
, вы можете увидеть незначительное улучшение (если только оптимизатор запросов теперь не достаточно умен, чтобы выполнить эту оптимизацию самостоятельно). Кроме этого, это, возможно, лучшее, что вы можете сделать.4. Я только что читал о count (colname) и, согласно этому парню , он не делает то же самое, если задействованы значения null. Мне также интересно, может быть, распределение значений для столбца time распределено не очень хорошо, в результате чего оптимизатор просто игнорирует это и выполняет сканирование таблицы.
5. @Marvo:
count(name-of-your-primary-key-column)
позволяет избежатьnull
проблемы со значениями, потому что вы не можете иметь нулевое значение в столбце первичного ключа.
Ответ №1:
Если этого все еще недостаточно, тогда ваш единственный выбор — это разбиение таблицы на разделы. Многие движки БД позволяют указывать автоматические разделы.
Комментарии:
1. Я не понимаю, как разделение изменит этот запрос.
2. Если вы разделите столбец time на диапазоны, вы получите разделенные таблицы, каждая из которых содержит часть от 1000000 записей. Допустим, вы разделяете на 10 таблиц, в итоге у вас будет примерно 100000 записей в таблице. Таким образом, запросы будут выполняться на таблицах меньшего размера, и это должно сократить время запроса.
3. @Билли, посмотри, например, пункты маркера в конце этой страницы: dev.mysql.com/doc/refman/5.1/en/partitioning-range.html
Ответ №2:
Попробуйте с помощью приведенного ниже.
выберите count (YourPrimaryKey) из, order
где time
> 1307894400000 amp;amp; time
<1307980799999
Комментарии:
1. Я пробовал, count (id) и count (*) одинаковы («id» — первичный ключ)