Mysql

連接選擇的Mysql索引

  • December 7, 2018

對於以下查詢

SELECT MAX(CONCAT(date, ' ', last_entry)) AS LAST_LOG
   FROM entry_log
   WHERE TRIM(LEADING 0 FROM card_no)='2948'

我有索引

date
card_no
date,last_entry
date,last_entry,card_no

我的解釋節目

id  select_type     table       type    possible_keys   key             key_len     ref     rows    Extra   
1   SIMPLE          entry_log   index   NULL            date_last_card  158         NULL    103766  Using where; Using index

我的解釋擴展節目

id  select_type     table           type    possible_keys   key             key_len     ref     rows    filtered    Extra   
1     SIMPLE        entry_log       index   NULL            date_last_card  158         NULL    103766  100.00      Using where; Using index

我想知道我可以刪除/使用哪個索引,我在正確的道路上,我應該如何提高上述查詢的執行時間?

CREATE TABLE `entry_log` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`card_no` varchar(50) NOT NULL,
`date` date NOT NULL,
`first_entry` time NOT NULL,
`last_entry` time NOT NULL,
`all_entry` text NOT NULL,
`entry_time` datetime NOT NULL,
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=9308 DEFAULT CHARSET=latin1

假設card_nolog_entry擁有VARCHARCHAR鍵入,我將首先在 上添加一個索引(card_no, date, last_entry)

ALTER TABLE entry_log
 ADD INDEX card_no__date__last_entry__ix
   (card_no, date, last_entry) ;

然後使用這個查詢:

SELECT CONCAT(date, ' ', last_entry) AS LAST_LOG 
FROM entry_log 
WHERE card_no = LPAD('2948', 32, '0')
ORDER BY date DESC, last_entry DESC
LIMIT 1 ;

列表中的值IN應包括不超過該類型允許的最大值的所有長度。上面的例子是針對VARCHAR(8).

更新:由於已明確該card_no列始終為 32 個字元並用零填充,因此查詢條件簡化為:

WHERE card_no IN ('2948', '02948', '002948', ..., '000...0002948')to

WHERE card_no = RIGHT(CONCAT('000..00', '2948'), 32)或簡單地

WHERE card_no = LPAD('2948', 32, '0')

引用自:https://dba.stackexchange.com/questions/99202