2016-03-31 2 views
0

У меня есть таблица MySQL (InnoDB), в которой у меня есть большое количество строк (пара миллионов). Я делаю запросы, как например:Сравнение столбца TIMESTAMP для большой таблицы

SELECT SQL_CALC_FOUND_ROWS `a` 
FROM `logs` 
WHERE `connect_timestamp` > 10000 
ORDER BY `connect_timestamp` DESC 
LIMIT 1 

У меня есть нормальный индекс добавляется к столбцу, однако запрос, как это занимает до 20 секунд, есть лучший способ?

+0

Что такое «нормальный» индекс? – Martin

+0

вы хотите иметь индекс в столбце 'connect_timestamp'. – Martin

+0

И используйте 'EXPLAIN', чтобы помочь вам объяснить SQL – Martin

ответ

1

Редактировать на основе комментариев от spencer7593 и Мартин:

Простой подсчет + выберите запрос может быть намного быстрее, чем один SQL_CALC_FOUND_ROWS. см: Which is fastest? SELECT SQL_CALC_FOUND_ROWS FROM `table`, or SELECT COUNT(*)

Я предлагаю работает как исходный запрос и:

SELECT count(*) 
FROM `logs` 
WHERE `connect_timestamp` > 10000 

плюс:

SELECT `a` 
FROM `logs` 
WHERE `connect_timestamp` > 10000 
ORDER BY `connect_timestamp` DESC 
LIMIT 1 

Лучший даже запускать все с EXPLAIN добавил измерить (и добавить) среды выполнения и см. разницу, вы также можете добавить SQL_NO_CACHE для имитации первого запуска. см: https://www.percona.com/blog/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows/

Если это не помогает вообще я предлагаю посмотреть на следующие:

вещей вы можете попробовать:

  • индекс столбца, который используется для поиска (вы, кажется, уже сделали это)
  • Сделайте запрос для конкретных запросов, которые должны выполняться часто.
  • Попробуйте кэшировать определенную таблицу, если на сервере имеется память.
  • Также, как сказал Мартин в комментариях, поставьте EXPLAIN перед запросом, чтобы увидеть, какая часть запроса занимает все время. Может быть, вы можете что-то изменить.

Это те вещи, которые я могу придумать.

+1

не является столбцом 'a', который вызывается' select'? – Martin

+0

если нет, то, конечно, SQL-код COUNT лучше, чем текущий SQL-код OPs? – Martin

+0

О, мой плохой :) переименование выбранной переменной в этом случае, но переименование результата, безусловно, не замедлит запрос, я думаю. Я удалю его, спасибо! – Jester

0
INDEX(connect_timestamp, a) 

Это будет «покрытие» индекс, тем самым ускоряя SQL_CALC_FOUND_ROWS, а также SELECT ... LIMIT 1.

Он должен будет сканировать с конца индекса до 10000. Сколько строк это?

Если connect_timestamp есть несколько типов CHAR вместо некоторого типа INT, то у вас есть другой проблемы. Пожалуйста, укажите SHOW CREATE TABLE.

Смежные вопросы