как мне оптимизировать этот sql: выберите count (*) из `order`, где `time`> 1307894400000

#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 where time >1307894400000 amp;amp; time <1307980799999 outpot

3. У вас уже есть индекс в 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» — первичный ключ)