select * from test1其中name='javacode3500000 '和sex = 2;--| id | name | sex | email |--| 3500000 | javacode 3500000 | 2 | javacode3500000@163.com |-集合中的一行(0。如何正確的使用索引 mysql索引怎么實現(xiàn)( 四 )。" />

日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

如何正確的使用索引 mysql索引怎么實現(xiàn)( 四 )


看看這個查詢:
mysql> select * from test1其中name='javacode3500000 '和sex = 2;--| id | name | sex | email |--| 3500000 | javacode 3500000 | 2 | javacode3500000@163.com |-集合中的一行(0.00秒)
上面的查詢速度很快,名字和性別上分別有索引 。你認(rèn)為應(yīng)該取哪個指標(biāo)?
有人說名字位于第一位,所以取名字字段所在的索引 。該過程可以解釋如下:
轉(zhuǎn)到name所在的索引,找到對應(yīng)于javacode3500000的所有記錄 。
遍歷記錄,篩選出性別=2的值 。
我們來看看name='javacode3500000 '的檢索速度,真的很快,如下:
MySQL > select * from test1 where name = ' javacode 3500000 ';--| id | name | sex | email |--| 3500000 | javacode 3500000 | 2 | javacode3500000@163.com |-集合中的一行(0.00秒)
真的可以取名字索引然后過濾,速度也很快 。真的和where之后的字段順序有關(guān)嗎?讓我們交換姓名和性別的順序,如下所示:
mysql> select * from test1其中sex=2,name = ' javacode3500000--| id | name | sex | email |--| 3500000 | javacode 3500000 | 2 | javacode3500000@163.com |-集合中的一行(0.00秒)
速度還是很快的 。是不是應(yīng)該先通過性別索引檢索數(shù)據(jù),再篩選名字?我們先來看看sex=2的查詢速度:
MySQL > select count(id)from test1其中sex = 2;-| count(id)|-| 2000000 |-集合中的一行(0.36秒)
看上面,查詢用時360毫秒,有200萬條數(shù)據(jù) 。如果拿性來說,肯定不行 。
我們用解釋來看看:
mysql >解釋select * from test1,其中sex=2,name = ' javacode3500000--------------------- id | select _ type | table | partitions | type | possible _ keys | key | key _ len | ref | rows | filtered | Extra |------------- 1 | SIMPLE | test1 | NULL | ref | idx 1,id x2 | idx 1 | 62 | const | 1 | 50.00 | Using where |------------------------//h/]1行,1警告(0
possible_keys:列出該查詢可能采用的兩個索引(idx1,idx2) 。
其實是idx1(關(guān)鍵列:索引實際取) 。
當(dāng)多個條件中存在指標(biāo),且關(guān)系為and時,將取區(qū)分度高的指標(biāo) 。很明顯,姓名字段重復(fù)度低,取姓名查詢會更快 。
模糊查詢
看兩個查詢
MySQL > select count(*)from test1a where a . name like ' javacode 1000% ';-| count(*)|-| 1111 |-集合中的1行(0.00秒)MySQL > select count(*)from test1a其中a.name類似于“% javacode 1000%”;-| count(*)|-| 1111 |-集合中的1行(1.78秒)
上面的第一個查詢可以使用name字段上面的索引,后面的查詢無法確定要搜索的值的范圍,所以只能掃描整個表而不使用索引,所以速度比較慢,如上所述 。
返回到表格
當(dāng)要查詢的數(shù)據(jù)不在索引樹中時,需要再次從聚集索引中檢索 。這個過程叫做表返回,比如查詢:
MySQL > select * from test1 where name = ' javacode 3500000 ';--| id | name | sex | email |--| 3500000 | javacode 3500000 | 2 | javacode3500000@163.com |-集合中的一行(0.00秒)
上面的查詢是*,因為姓名列所在的索引只包含姓名和id兩列的值,不包含性別和郵箱,所以上面的過程如下:
取名稱索引檢索javacode3500000對應(yīng)的記錄,取出3500000的id 。
從主鍵索引中檢索id=3500000的記錄,并獲取所有字段的值 。
索引覆蓋
查詢中使用的索引樹包含了查詢需要的所有字段的值,不需要聚合索引來檢索數(shù)據(jù) 。這就是所謂的指數(shù)覆蓋率 。
讓我們來看一個查詢:
select id,name from test1 where name = ' javacode 3500000 ';
name對應(yīng)idx1索引,id是主鍵,所以idx1索引葉子的子節(jié)點(diǎn)包含name和id的值 。這個查詢只需要將idx1作為索引 。如果在select之后使用了*,則需要返回到表中一次,以獲取sex和email的值 。
所以,寫sql的時候,盡量避免使用* 。*可能會多一個回表操作,看能不能通過索引疊加實現(xiàn)效率更高 。

推薦閱讀