Mysql
連接選擇的Mysql索引
對於以下查詢
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_no
並log_entry
擁有VARCHAR
或CHAR
鍵入,我將首先在 上添加一個索引(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')