今天知數(shù)堂一個(gè)學(xué)生反饋說(shuō)在優(yōu)化課中老師講Innodb是以主鍵排序存儲(chǔ),讀取的時(shí)間以主鍵為順序讀取,但發(fā)現(xiàn)個(gè)例外,如下:
CREATE TABLE zst_t1 ( uid int(10) NOT NULL AUTO_INCREMENT, id int(11) NOT NULL, PRIMARY KEY ( uid ), KEY idx_id ( id ) ) ENGINE=InnoDB;' |
寫(xiě)入數(shù)據(jù):
INSERT INTO zst_t1 VALUES (1,1),(12,1),(22,1),(23,1),(33,1),(2,2),(3,2),(10,2),(11,2),(4,4),(13,4),(14,4); |
執(zhí)行查詢(xún):
select * from zst_t1;
為什么這個(gè)順序是亂的,不按順序排列呢?難道Innodb表并不是全按主鍵存儲(chǔ)?
使用innodb_ruby這個(gè)工具查看一下存儲(chǔ)結(jié)構(gòu)什么樣
看樣子存儲(chǔ)還是按主鍵排序存儲(chǔ)的。沒(méi)毛病。
再來(lái)看一下該表的索引:
看到這里應(yīng)該明白了怎么會(huì)事了吧,原來(lái)這個(gè)查詢(xún)是走的索引覆蓋,沒(méi)有在進(jìn)行回表讀取原數(shù)據(jù)。另外,也在此說(shuō)明,Innodb二索索引包含了主鍵存儲(chǔ)。
來(lái)繼續(xù)證明一下:
看到using index 吧,表示這個(gè)查詢(xún)利用索引查詢(xún)出來(lái)結(jié)果,不用讀取原表。
那么我們給造一個(gè)通過(guò)主鍵讀取數(shù)據(jù)操作:
select * from zst_t1 use index(primary);
select * from zst_t1 use index(primary);
#確認(rèn)一下。
總結(jié):
這個(gè)其實(shí)就是一個(gè)索引包含的查詢(xún)案例。 如果靜下來(lái)思考一下,也許很快就明白了。也不用這樣去查問(wèn)題。
技術(shù)在于折騰,多搞搞就明白了:)。
新聞熱點(diǎn)
疑難解答
圖片精選