यदि आप एक इंडेक्स का उपयोग करना चाहते हैं और एक टेबल स्कैन नहीं करने के लिए क्वेरी:
WHERE timestamp >= CURDATE()
AND timestamp < CURDATE() + INTERVAL 1 DAY
यह दिखाने के लिए कि यह वास्तविक निष्पादन योजनाओं पर क्या फर्क पड़ता है, हम एसक्यूएल-फिडल (एक अत्यंत सहायक साइट) के साथ परीक्षण करेंगे :
CREATE TABLE test --- simple table
( id INT NOT NULL AUTO_INCREMENT
,`timestamp` datetime --- index timestamp
, data VARCHAR(100) NOT NULL
DEFAULT 'Sample data'
, PRIMARY KEY (id)
, INDEX t_IX (`timestamp`, id)
) ;
INSERT INTO test
(`timestamp`)
VALUES
('2013-02-08 00:01:12'),
--- --- insert about 7k rows
('2013-02-08 20:01:12') ;
अब 2 संस्करणों की कोशिश करें।
संस्करण 1 के साथ DATE(timestamp) = ?
EXPLAIN
SELECT * FROM test
WHERE DATE(timestamp) = CURDATE() --- using DATE(timestamp)
ORDER BY timestamp ;
के बारे में बताएं:
ID SELECT_TYPE TABLE TYPE POSSIBLE_KEYS KEY KEY_LEN REF
1 SIMPLE test ALL
ROWS FILTERED EXTRA
6671 100 Using where; Using filesort
यह सभी (6671) पंक्तियों को फ़िल्टर करता है और फिर एक फाइलशॉर्ट करता है (यह समस्या नहीं है क्योंकि लौटी पंक्तियाँ कुछ कम हैं)
संस्करण 2 के साथ timestamp <= ? AND timestamp < ?
EXPLAIN
SELECT * FROM test
WHERE timestamp >= CURDATE()
AND timestamp < CURDATE() + INTERVAL 1 DAY
ORDER BY timestamp ;
के बारे में बताएं:
ID SELECT_TYPE TABLE TYPE POSSIBLE_KEYS KEY KEY_LEN REF
1 SIMPLE test range t_IX t_IX 9
ROWS FILTERED EXTRA
2 100 Using where
यह इंडेक्स पर एक रेंज स्कैन का उपयोग करता है , और फिर तालिका से केवल संबंधित पंक्तियों को पढ़ता है।