为什么我的MySQL表上的索引没有被使用?

时间:2017-10-24 02:59:48

标签: mysql indexing query-optimization

我在MySQL(InnoDB引擎)中有一个包含100M记录的表。结构如下:

CREATE TABLE LEDGER_AGR (
    ID BIGINT(20) NOT NULL AUTO_INCREMENT,
    `Booking` int(11) NOT NULL,
    `LType` varchar(5) NOT NULL,
    `PType` varchar(5) NOT NULL,
    `FType` varchar(5) DEFAULT NULL,
    `TType` varchar(10) DEFAULT NULL,
    `AccountCode` varchar(55) DEFAULT NULL,
    `AgAccountId` int(11) DEFAULT '0',
    `TransactionDate` date NOT NULL,
    `DebitAmt` decimal(37,6) DEFAULT '0.000000',
    `CreditAmt` decimal(37,6) DEFAULT '0.000000',
    KEY `TRANSACTION_DATE` (`TransactionDate`)
)
ENGINE=InnoDB;

我在做的时候:

EXPLAIN
SELECT * FROM LEDGER_AGR
WHERE TransactionDate >= '2000-08-01'
  AND TransactionDate <= '2017-08-01'

它没有使用TRANSACTION_DATE索引。但是当我在做的时候:

EXPLAIN
SELECT * FROM LEDGER_AGR
WHERE TransactionDate = '2000-08-01'

使用TRANSACTION_DATE索引。有人可以解释一下吗?

1 个答案:

答案 0 :(得分:1)

范围查询#1的选择性很差。等式查询#2具有出色的选择性。当结果行将<&lt;时,优化器很可能选择索引访问路径。表中总行数的1%。当结果行占总数的很大一部分时,后端优化器不太可能更喜欢索引,例如所有行的一半或四分之一。

一系列的2000-08-01&#39;通过&#39; 2000-08-03&#39;可能会利用该指数。

cf:mysql not using index?