[英]Query Optimization
我有2個查詢。
第一:
SELECT * FROM `table` WHERE col='xyz' LIMIT 100
//Time Taken: 0.0047s
第二:
SELECT * FROM `table` WHERE col='xyz' ORDER BY Id DESC LIMIT 100
//Time Taken: 1.8208s
第二個需要更長的時間。 我知道這是為什么,這是因為首先我必須選擇整個表,然后進行排序,而第一個查詢僅返回前100行。
有什么方法可以使用另一種方法進行ORDER BY,例如選擇最后100行然后進行排序? 還是我做錯了查詢,它可以變得更快?
請注意,該ID為自動遞增,因此選擇最后一行仍會在訂購時返回正確的數據。
CREATE TABLE `table`(
`Id` BIGINT NOT NULL AUTO_INCREMENT,
`dateReg` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`Id`)
) ENGINE=MyISAM
對於連續的ID:
SELECT t.*
FROM TABLE t
JOIN (SELECT MAX(t.id) 'maxid'
FROM TABLE t) max ON t.id BETWEEN max.maxid-100 AND max.maxid
WHERE t.col = 'xyz'
對於非連續ID:
SELECT a.*
FROM (SELECT t.*,
@rownum := @rownum+1 AS rownum
FROM TABLE t, (SELECT @rownum := 0) r
WHERE t.col = 'xyz') a,
(SELECT COUNT(t.*) 'max'
FROM TABLE t
WHERE t.col = 'xyz') m
WHERE a.rownum BETWEEN m.max-100 AND m.max
如果您對表使用MyISAM
,請在(col, id)
上創建一個復合索引。
在InnoDB
, PRIMARY KEY
作為行指針隱式包含在表中,因為InnoDB
表是按設計進行索引組織的。
在InnoDB
情況下,要在(col, id)
上建立復合索引(col, id)
只需在col
上創建索引並確保id
是PRIMARY KEY
。
該索引將用於對col
和id
排序。
該索引是一個B-Tree
結構,因此它可以以相同的效率迭代ASC
和DESC
。
您的id列應設置為主鍵(或者,如果您還有其他主鍵,則無論如何都應在其上放置一個索引)。 這樣應該可以使查詢足夠快。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.