我找得到一個給定的記錄集的最新日期,其中字段我需要過濾儘可能最佳的查詢優化SQL查詢是:與agregate指數
- CREATEDATE:DATETIME
- 的TransactionStatus :VARCHAR(10)
- DocumentSeries:VARCHAR(45)
比較簡單的查詢是這個
SELECT MAX(CreateDate) FROM transactionsheaders WHERE TransactionStatus="N" AND DocumentSeries='Z';
當我使用我解釋得
EXPLAIN(SELECT MAX(CreateDate) FROM transactionsheaders WHERE TransactionStatus="N" AND DocumentSeries='Z');
+----+-------------+---------------------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------------------+------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE | transactionsheaders | ALL | NULL | NULL | NULL | NULL | 5752 | Using where |
+----+-------------+---------------------+------+---------------+------+---------+------+------+-------------+
,共記錄集的5715
好吧,我有沒有索引的使用,我用文字和datetime列...我想這不是一件容易的情況下,所以我決定將列添加到具有意義DocumentSeries相同,但一個int表,所以查詢將是:
SELECT MAX(CreateDate) FROM transactionsheaders WHERE TransactionStatus="N" AND DocumentSeriesUID=2;
並且增加了agregates的索引3柱納秒與
ALTER TABLE `transactionsheaders` ADD INDEX `index_doc_series` (`DocumentSeriesUID` ASC, `CreateDate` ASC, `TransactionStatus` ASC);
和解釋輸出
+----+-------------+---------------------+------+------------------+------------------+---------+-------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------------------+------+------------------+------------------+---------+-------+------+--------------------------+
| 1 | SIMPLE | transactionsheaders | ref | index_doc_series | index_doc_series | 4 | const | 2876 | Using where; Using index |
+----+-------------+---------------------+------+------------------+------------------+---------+-------+------+--------------------------+
Q1。呃...顯然我使用的數據較少,但是如果我使用相同的條件進行計數,則會得到5703個結果,因此,這有點令人困惑。我知道EXPLAIN估計查詢需要獲取的行數,但它怎麼可能關閉?
再說,我不如果我需要一次全部搞定一切,所以我的下一個考驗將是取前10個結果是適合我的搜索條件
SELECT MAX(Q.CreateDate) FROM((SELECT CreateDate FROM transactionsheaders WHERE TransactionStatus="N" AND DocumentSeriesUID='2' ORDER BY CreateDate DESC LIMIT 10) as Q);
,但... m使用ORDER BY,我不需要MAX,我只限於1?
SELECT CreateDate FROM transactionsheaders WHERE TransactionStatus="N" AND DocumentSeriesUID='2' ORDER BY CreateDate DESC LIMIT 1;
和EXPLAIN產生與使用MAX查詢相同的結果。
那麼,所有這些只是問我該如何優化這個查詢?它是否已經通過唱出索引進行了優化?我可以走得更遠嗎?
乾杯