我有一個分頁查詢,對一個大表進行范圍索引掃描:
我有一個分頁查詢,對一個大表進行范圍索引掃描:
create table t_dummy (
id int not null auto_increment,
field1 varchar(255) not null,
updated_ts timestamp null default null,
primary key(id)。
關鍵idx_name (uped_ts)
這個查詢看起來像這樣:
select * from T_dummy a
where a.field1 = 'VALUE'/span>
and (a.uped_ts > 'some time' or (a. updated_ts > 'some time' or = 'some time' and a.id >/span> x)
order by a.uped_ts, a.id
限制100
解釋計劃顯示成本很大,rows值很高,但是,它使用了所有正確的索引,執行起來似乎很快。誰能告訴我這是否意味著該查詢是低效的?
uj5u.com熱心網友回復:
EXPLAIN可能會產生誤導。它可以報告一個很高的rows值,盡管事實上MySQL優化LIMIT查詢,一旦找到足夠的行來滿足你要求的LIMIT(在你的例子中是100行)就停止。
問題是,在查詢執行 EXPLAIN 時,它不一定知道要檢查多少條記錄才能找到至少 100 條滿足 WHERE 子句中條件的記錄。
所以當你有一個 LIMIT 查詢時,你通常可以忽略 EXPLAIN 的 rows 欄位。它可能不會真的需要檢查這么多行。
uj5u.com熱心網友回復:
如果執行的速度足夠快,就不要擔心了。 如果不是這樣,可以考慮使用(field1,uped_ts)索引和/或將你的查詢改為
and a.uped_ts >= 's some time' and (a. updated_ts > 'some time' or a.id > x)
uj5u.com熱心網友回復:
正如Bill所說,不能相信Explain會考慮到LIMIT。
下面將確認該查詢只觸及100行:
FLUSH STATUS;
SELECT ...。
SHOW SESSION STATUS LIKE 'Handler%'/span>。
Handler_read%的值可能會加到100左右。 可能不會有Handler_write%值 -- 它們將表明創建了一個臨時表。
一個提示:如果你使用LIMIT 101,你將得到顯示的100行,以及一個是否有更多行的指示。 這樣,以非常低的成本,避免了有一個[Next]按鈕,有時會帶來一個空白頁。
我對這個話題的提示。 http://mysql.rjweb.org/doc.php/pagination
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/321937.html
標籤:
