Query-Performance

MariaDB 查詢優化器忽略索引

  • July 4, 2022
  • MariaDB 版本 10.5.15
  • 簡單表,兩列帶索引

如果我對錶進行查詢並在 where 條件中使用具有索引的兩列,則不使用索引。為什麼?

CREATE TABLE `logs` (
 `log_id` int(10) NOT NULL AUTO_INCREMENT,
 `date` datetime DEFAULT NULL,
 `status` int(10) DEFAULT 0,
 `text` varchar(255) DEFAULT NULL,
 PRIMARY KEY (`log_id`),
 KEY `status` (`status`),
 KEY `date` (`date`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

日期在哪裡

analyze select count(*)
from logs 
where `date` < "2022-01-01 00:00:00"

使用索引 => 1.4s

在哪裡狀態

analyze select count(*)
from logs 
where status = 860

使用索引 => ~0.9s

日期和狀態

analyze select count(*)
from logs 
where status = 860
and `date` < "2022-01-01 00:00:00"

不使用索引 => ~7s

ALTER TABLE logs
   DROP INDEX(status)
   ADD INDEX(status, date)

添加的“複合”索引將有助於兩者

WHERE status = ...

WHERE status = ... AND date < ...

並且

WHERE date < ... AND status = ...

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