MySQL - SQLite Как улучшить этот очень простой запрос? - PullRequest
3 голосов
/ 02 сентября 2010

У меня есть одна простая, но большая таблица.

id_tick   INTEGER      eg: 1622911
price     DOUBLE       eg: 1.31723
timestamp DATETIME     eg: '2010-04-28 09:34:23'

За 1 месяц данных у меня 2,3 миллиона строк (150 МБ)

Мой запрос направлен на возвращение последней цены позаданное время.

Сначала я настроил таблицу SQLite и использовал запрос:

SELECT max(id_tick), price, timestamp 
FROM EURUSD 
WHERE timestamp <='2010-04-16 15:22:05'

Он выполняется за 1.6 с.

Как мне нужно выполнить этот запросв течение нескольких тысяч раз 1.6с слишком долго ...

Затем я создал таблицу MySQL и изменил запрос (функция max отличается от MySQL до SQLite):

SELECT id_tick, price, timestamp
FROM EURUSD
WHERE id_tick = (SELECT MAX(id_tick) 
                 FROM EURUSD WHERE timestamp <='2010-04-16 15:22:05')

Время выполнения становится намного хуже 3,6 с (я знаю, что могу избежать подзапроса, используя ORDER BY и LIMIT 1, но это не улучшает время выполнения.)

Я использую только один месяц данных длясейчас, но в какой-то момент мне придется использовать несколько лет.

Тогда у меня следующие вопросы:

  1. Есть ли способ улучшить мой запрос?
  2. учитывая большой набор данных, я должен использовать другой механизм базы данных?
  3. какие-нибудь советы?

Спасибо!

Ответы [ 4 ]

1 голос
/ 02 сентября 2010

1) Убедитесь, что у вас есть индекс на временной метке

2) Предполагая, что id_tick является одновременно PRIMARY KEY и Clustered Index, и предполагая, что id_tick увеличивается как функция времени (так как вы делаете MAX)

Вы можете попробовать это:

SELECT id_tick, price, timestamp 
FROM EURUSD 
WHERE id_tick = (SELECT id_tick
                   FROM EURUSD WHERE timestamp <='2010-04-16 15:22:05'
                   ORDER BY id_tick DESC
                   LIMIT 1)

Это должно быть похоже на производительность janmoesen, поскольку в любом событии должна быть высокая корреляция страниц между id_tick и отметкой времени

0 голосов
/ 02 сентября 2010

ОК, я думаю, что мой индекс как-то поврежден, повторная индексация значительно улучшила производительность.

Следующее теперь выполняется за 0,0012 с (без кэширования)

SELECT id_tick, price, timestamp
FROM EURUSD
WHERE timestamp <= '2010-05-11 05:30:10'
ORDER by id_tick desc
LIMIT 1

Спасибо!

0 голосов
/ 02 сентября 2010

Вы делаете анализ, используя ВСЕ галочки для больших интервалов? Я пытался отфильтровать данные в графиках минут / часов / дней и т. Д.

0 голосов
/ 02 сентября 2010

Есть ли у вас проиндексированные поля?

индексирование timestamp и / или id_tick может многое изменить.

Кроме того, почему вы не используете интервал для отметки времени?

WHERE timestamp >= '2010-04-15 15:22:05' AND timestamp <= '2010-04-16 15:22:05'

, что облегчит бремя функции MAX.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...