ฉันกำลังพยายามจัดทำดัชนีblogentries
ฐานข้อมูลของฉันเพื่อประสิทธิภาพที่ดีขึ้น แต่พบปัญหา
นี่คือโครงสร้าง:
CREATE TABLE IF NOT EXISTS `blogentries` (
`id_id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`title_id` varchar(100) COLLATE latin1_german2_ci NOT NULL,
`entry_id` varchar(5000) COLLATE latin1_german2_ci NOT NULL,
`date_id` int(11) NOT NULL,
PRIMARY KEY (`id_id`)
)
ENGINE=MyISAM
DEFAULT CHARSET=latin1
COLLATE=latin1_german2_ci
AUTO_INCREMENT=271;
แบบสอบถามแบบนี้ใช้ดัชนีอย่างถูกต้อง:
EXPLAIN SELECT id_id,title_id FROM blogentries ORDER by id_id DESC
+ ---- + + ------------- ------------- + ------- + -------- ------- + --------- + --------- + ------ + ------ + -------- ----- + | id | select_type | ตาราง | ประเภท | possible_keys | กุญแจ key_len | ref | แถว | พิเศษ | + ---- + + ------------- ------------- + ------- + -------- ------- + --------- + --------- + ------ + ------ + -------- ----- + | 1 | ง่าย ๆ บล็อก ดัชนี | NULL | หลัก | 114 | NULL | 126 | ใช้ดัชนี | + ---- + + ------------- ------------- + ------- + -------- ------- + --------- + --------- + ------ + ------ + -------- ----- +
อย่างไรก็ตามเมื่อฉันเพิ่มentry_id
เข้าไปในSELECT
แบบสอบถามมันใช้ filesort
EXPLAIN SELECT id_id,title_id,entry_id FROM blogentries ORDER by id_id DESC
+ ---- + + ------------- ------------- + ------ + --------- ------ ------ + + --------- + ------ + ------ + ------------ ---- + | id | select_type | ตาราง | ประเภท | possible_keys | กุญแจ key_len | ref | แถว | พิเศษ | + ---- + + ------------- ------------- + ------ + --------- ------ ------ + + --------- + ------ + ------ + ------------ ---- + | 1 | ง่าย ๆ บล็อก ทั้งหมด | NULL | NULL | NULL | NULL | 126 | การใช้ filesort | + ---- + + ------------- ------------- + ------ + --------- ------ ------ + + --------- + ------ + ------ + ------------ ---- +
ฉันสงสัยว่าทำไมสิ่งนี้จึงเกิดขึ้นและฉันจะหลีกเลี่ยงได้อย่างไร มันเกิดจากการVarChar
และสิ่งที่ควรจะเปลี่ยนเป็นอย่างอื่น?
ฉันพยายามที่จะทำให้ข้อความค้นหาทั้งหมดของฉันใช้ดัชนีขณะที่ฉันกำลังใช้งานสูงHandler_read_rnd
และมีHandler_read_rnd_next
ค่า
หากคุณต้องการข้อมูลอื่น ๆ ฉันสามารถโพสต์ได้เช่นกัน
WHERE 1=1
ในแบบสอบถามที่สองของคุณ