2014-01-09 5 views
0

в базе данных MySQL У меня есть следующая таблица:MySQL запрос слишком медленно

  • идентификатор INT Первичный ключ
  • отметка времени метки времени
  • TPID VARCHAR
  • tpidno Int
  • SerialNumber Int
  • command varchar
  • sequence int
  • VARCHAR
  • начальный промежуток
  • EndTime VARCHAR
  • PosData VARCHAR
  • ...

У меня также есть 3 вторичные показатели:

  1. TPID, tpidno
  2. SerialNumber
  3. команда

Таблица содержит ~ 2.5х строк и о 500MB

Хотя у меня есть сложные запросы, которые работают быстро, у меня есть большая задержка на этих двух простых запросах:

Select id, sequence, PosData 
    From myTable 
Where serialNumber = 130541 
    and command = "myCommand" 
    and startTime = "20140106194300" 
    and endtime = "20140106200000" 

(~ 4.4sec)

Select id 
    From myTable 
Where serialNumber = 130541 
    and command = 'myCommand' 
    and sequence = 128 

(~ 4.5sec)

ли больше показателей, как

  • SerialNumber, команда
  • команда, последовательность

или

  • SerialNumber, команда, последовательность

ускорит запросы?

При первом запросе может возникнуть проблема с типом данных startTime и endTime? если бы они были int вместо varchar, было бы лучше?

любые другие предложения?

+1

Почему ваши даты начала и окончания поля не 'date' или' datetime' типы данных? С таким количеством записей я уверен, что больше индексов помогут. – Revent

+0

никакой конкретной причины, вероятно, потому, что в базе данных создать было быстрее, чтобы добавить данные, не отбрасывая их. сравнение varchar медленнее, чем datetime? – Reven

+0

При изменении типа данных поля, которое существует в индексе, индекс нуждается в отдыхе или он также обновлен? Я думаю, что скорость базы данных замедлилась с момента изменения типа данных (tpid от int до smallint и последовательности от int до mediumint) – Reven

ответ

1

Единственный индекс на (serialnumber, command) окончательно улучшит производительность для этих двух запросов. Далее вы можете добавить другие столбцы, чтобы сделать это еще быстрее. Однако лучший выбор других столбцов зависит от распределения данных и от того, какой из двух утверждений чаще всего выполняется. Возможно, даже не стоит добавлять эти столбцы, если два других столбца очень избирательны.

Тип данных для startdate и enddate, по крайней мере, неудачный. Правильные типы повысят производительность в диапазоне от «немного» до «большого» в зависимости от вашего SQL. SQL выше будет в «маленьком» диапазоне.

Некоторые рефов:

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