2
私は100MレコードのMySQL(InnoDBエンジン)のテーブルを持っています。構造は以下の通りです:MySQLテーブルのインデックスが使用されていないのはなぜですか?
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;
私がやっているとき:それはTRANSACTION_DATE
インデックスを使用していない
EXPLAIN
SELECT * FROM LEDGER_AGR
WHERE TransactionDate >= '2000-08-01'
AND TransactionDate <= '2017-08-01'
。しかし、私はやっているとき:
EXPLAIN
SELECT * FROM LEDGER_AGR
WHERE TransactionDate = '2000-08-01'
それあるはTRANSACTION_DATE
インデックスを使用します。誰か説明してもらえますか?
返信いただきありがとうございます!しかし、以下のクエリでもフルテーブルスキャンを行っています.EXPLAIN SELECT * FROM LEDGER_AGR WHERE TransactionDate> = '2017-08-01' AND TransactionDate <= '2017-09-01'これの出力は私はTRANSACTION_DATEインデックスを使用する計画を期待していましたが、残念ながらまだ全テーブルスキャンを行っています。 – Mukta
「小さな」小数を定義してください。つまり、8月〜32日にバイナリ検索を行い、何日に何パーセントの行がテーブルスキャンから切り替わるかを教えてください。また、カバーインデックス、https://en.wikipedia.org/wiki/Database_index#Covering_indexで狭いスライスを求めることを検討してください。例えば。その順序で(TransactionDate、DebitAmt)に新しいインデックスを作成し、 "select *"の代わりに "select TransactionDate、DebitAmt ..."を要求してください –