簡體   English   中英

查詢優化

[英]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)上創建一個復合索引。

InnoDBPRIMARY KEY作為行指針隱式包含在表中,因為InnoDB表是按設計進行索引組織的。

InnoDB情況下,要在(col, id)上建立復合索引(col, id)只需在col上創建索引並確保idPRIMARY KEY

該索引將用於對colid排序。

該索引是一個B-Tree結構,因此它可以以相同的效率迭代ASCDESC

您的id列應設置為主鍵(或者,如果您還有其他主鍵,則無論如何都應在其上放置一個索引)。 這樣應該可以使查詢足夠快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM