我在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
索引。有人可以解释一下吗?
答案 0 :(得分:1)
范围查询#1的选择性很差。等式查询#2具有出色的选择性。当结果行将<&lt;时,优化器很可能选择索引访问路径。表中总行数的1%。当结果行占总数的很大一部分时,后端优化器不太可能更喜欢索引,例如所有行的一半或四分之一。
一系列的2000-08-01&#39;通过&#39; 2000-08-03&#39;可能会利用该指数。