2016-04-26 2 views
0

У меня есть следующий запрос, который требует времени. Тип Mytable является innodb и имеет первичный ключ в поле tsh_id . Я также добавил индекс в поле transaction_IdMysql запрос innodb, возвращающий медленный результат

следующее - это реализация внутри моей базы данных хранимой процедуры.

DECLARE lv_timestamp DATETIME(3); 
    SET @lv_timestamp = NOW(3); 

    IF(mycondition) then  
     SET @lv_Duration :=(SELECT UNIX_TIMESTAMP (@lv_timestamp) - UNIX_TIMESTAMP (`changedon`) 
     FROM `MyTable`   
     WHERE transaction_Id = _transaction_Id   
     ORDER BY tsh_id DESC 
     LIMIT 1)   
    End if; 

Пожалуйста, предложите какой-либо улучшение

Edit:

Объясните запрос говорит

"select_type":"SIMPLE", 
"table":"MyTable", 
"type":"ref", 
"possible_keys":"IX_MyTable_Transaction", 
"key":"IX_MyTable_Transaction", 
"key_len":"98", 
"ref":"const", 
"rows":1, 
"Extra":"Using where" 
+2

Что работает 'EXPLAIN' на запрос должен сказать? –

+0

Я отредактировал свой вопрос и подробно расскажу, что объясняет говорит –

+0

Я не могу сразу увидеть объяснение, что запрос сам по себе должен быть медленным. Может быть, кто-то еще с большим опытом оптимизации mysql будет иметь некоторый вклад. –

ответ

0
  1. Убедитесь, что индекс по MyTable.transaction_Id
  2. Марка убедитесь, что у вас есть innodb_buffer_pool_size, установленный на в вашей конфигурации MySQL
+0

У меня есть указатель на MyTable.transaction_Id, и я думаю, что innodb_buffer_pool_size установлен на уровне 1 ГБ или 500 МБ (у моего сервера mysql есть 4 ГБ ОЗУ) –

0

Я уверен, что ваш первичный ключ не является кластеризованным ключом (его может быть нулевым или уникальным, или вы изменили его в одной точке), поскольку это объясняет это поведение, по крайней мере, если transaction_Id не является уникальным (и в противном случае вам не потребуется limit 1).

Чтобы улучшить этот конкретный запрос, вы можете создать следующий индекс:

create index ix_mytable_transaction_id_tsh_id on MyTable (transaction_id, tsh_id desc); 

Используйте explain снова.

Если он не использует новый ключ, заставить его:

SELECT ... FROM `MyTable` force index(ix_mytable_transaction_id_tsh_id) ... 
+0

Это табличка innodb Mysql. Версия Mysql - 5.6.27. tsh_id - это первичный ключ с автоматическим приращением. не знаю.Я пробовал составной индекс, но в моем случае он почти избыточен, так как я только ищу на transaction_id. в то время как tsh_id (первичный ключ) упорядочен по предложению –

+0

Не могли бы вы опубликовать результаты: 'show index from MyTable;', 'explain extended ', 'show warnings;' (после объяснения расширенного), количество строк в resultset 'SELECT count (*) FROM MyTable WHERE transaction_Id = _transaction_Id', время, необходимое для его получения, и время, которое занимает ваш запрос. – Solarflare

+0

ok позвольте мне проверить –

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