簡體   English   中英

查詢優化

[英]Query optimization

SELECT nar.name, nar.reg, stat.lvl
FROM members AS nar
JOIN stats AS stat 
ON stat.id = nar.id
WHERE nar.ref = 9

我在兩個表中的ID上都有索引,也有索引Referavo。 但是,它仍然檢查stats表中的所有行(我使用Explain來獲取此信息),但是在members表中,它僅檢查一行應該是什么樣的行。 統計表有什么問題? 非常感謝你。

CREATE TABLE `members` (
 `id` int(11) NOT NULL
 `ref` int(11) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT


CREATE TABLE `stats` (
 `id` int(11) NOT NULL AUTO_INCREMENT
 PRIMARY KEY (`id`),
) ENGINE=InnoDB AUTO_INCREMENT=37 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC



id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE stat ALL PRIMARY NULL NULL NULL 22  
1 SIMPLE nar eq_ref PRIMARY PRIMARY 4 table_nme.stat.id 1 Using where

您的表很小,只有23行很小

MySQL根據表中有多少行以及將要選擇的估計數(從統計信息中)來選擇不同的查詢計划。 您應該使用真實數據對查詢進行性能測試-數據量和數據中值的分布都應盡可能真實。 否則,MySQL在測試中選擇的查詢計划可能與您的實時系統的實際查詢計划不同。

您的表是如此之小,以至於使用索引比直接檢查表要 請記住,檢查已在內存中的數據速度很快,但是讀取速度卻很慢。 訪問索引可能需要額外的讀取-首先必須獲取並讀取索引以找到要選擇的行,然后,如果索引不是覆蓋索引,則必須獲取並讀取表中的相關行以獲取索引。索引中沒有的值。 MySQL完全有權不使用索引,即使該索引可用,只要它認為這樣做會導致計划變慢。

在表中再放置幾行(千),然后嘗試再次運行EXPLAIN。 您可能會發現,當您有更多的行時,PRIMARY KEY索引將用於連接。

MySQL每張表一次只能使用一個索引,因此它使用索引查看member行,然后對ID進行順序搜索。

您必須為members表創建一個多列索引

 CREATE INDEX idref ON members(id,ref);

如果效果不好,請也嘗試反向(第一個:在成員上刪除索引idref)

 CREATE INDEX idref ON members(ref,id);

(我現在不能自己嘗試)

暫無
暫無

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

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