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

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


索引下推
縮寫(xiě)為ICP,索引條件下推(ICP)是MySQL 5.6中的新特性,是在存儲(chǔ)引擎層使用索引過(guò)濾數(shù)據(jù)的一種優(yōu)化方式 。ICP可以減少存儲(chǔ)引擎訪問(wèn)基表和MySQL服務(wù)器訪問(wèn)存儲(chǔ)引擎的次數(shù) 。
例如:
我們需要查詢姓名以javacode35開(kāi)頭,性別為1的記錄的數(shù)量 。sql如下所示:
MySQL > select count(id)from test1a,其中name like 'javacode35% ',sex = 1;-| count(id)|-| 55556 |-集合中的1行(0.19秒)
流程:
用javacode35按名稱(chēng)索引檢索第一條記錄,并獲取記錄id 。
此記錄R1是通過(guò)使用id從主鍵索引中找到的 。
判斷R1的性別是否為1,然后重復(fù)上述操作,直到找到所有記錄 。
在上面的過(guò)程中,需要取名字索引,返回表 。
如果采用ICP,我們可以這樣做,創(chuàng)建一個(gè)(姓名,性別)的組合索引 。查詢過(guò)程如下:
取(name,sex)索引用javacode35檢索第一條記錄,可以得到(name,sex,id),記錄為R1 。
判斷R1.sex是否為1,然后重復(fù)上述操作,直到找到所有記錄 。
這個(gè)過(guò)程不需要返回表,整個(gè)條件可以通過(guò)索引的數(shù)據(jù)進(jìn)行篩選,比上面的更快 。
數(shù)字使字符串類(lèi)索引無(wú)效 。
mysql> insert into test1 (id,name,sex,email)值(4000001,' 1 ',1,' javacode 2018 @ 163 . com ');查詢正常,1行受影響(0.00秒)MySQL > select * from test1 where name = ' 1 ';---| id | name | sex | email |--4000001 | 1 | 1 | javacode2018@163.com |--集合中的1行(0.00秒)MySQL > select * from test1 where name = 1;--| id | name | sex | email |--| 4000001 | 1 | 1 | javacode2018@163.com |-集合中的1行,65535個(gè)警告(3.30秒)
對(duì)于上面的三條sql,我們插入了一條記錄 。
第二個(gè)查詢很快,第三個(gè)查詢用name和1比較 。名字有索引,名字是字符串類(lèi)型 。用數(shù)字比較字符串時(shí),字符串會(huì)被強(qiáng)制轉(zhuǎn)換成數(shù)字再進(jìn)行比較,所以第二次查詢就變成了全表掃描,只能取出每一條數(shù)據(jù),名字會(huì)被轉(zhuǎn)換成數(shù)字再和1進(jìn)行比較 。
比較數(shù)值型字段和字符串有什么影響?如下所示:
MySQL > select * from test1 where id = ' 4000000 ';--| id | name | sex | email |--| 4000000 | javacode 4000000 | 2 | javacode4000000@163.com |-set中的1行(0.00秒)MySQL > select * from test1其中id = 4000000--| id | name | sex | email |--| 4000000 | javacode 4000000 | 2 | javacode4000000@163.com |-集合中的一行(0.00秒)
id上有一個(gè)主鍵索引,id的類(lèi)型為int 。如你所見(jiàn),上面兩個(gè)查詢都非常快,可以正常使用索引快速檢索,所以如果字段是數(shù)組類(lèi)型,查詢值是字符串還是數(shù)組都會(huì)被索引 。
函數(shù)使索引無(wú)效 。
mysql >從test1 a中選擇a.name 1其中a.name = ' javacode1-| a . name 1 |-| 1 |-集合中的1行,1個(gè)警告(0.00秒)MySQL > select * from test1a where concat(a . name,' 1 ')= ' javacode 11 ';--| id | name | sex | email |--| 1 | javacode 1 | 1 | javacode1@163.com |-集合中的一行(2.88秒)
名字上有索引,上面的查詢,第一個(gè)取索引,第二個(gè)不取,第二個(gè)使用函數(shù)后,名字所屬的索引樹(shù)無(wú)法快速定位到需要查找數(shù)據(jù)的頁(yè)面,只能將所有頁(yè)面的記錄加載到內(nèi)存中,用函數(shù)計(jì)算每個(gè)數(shù)據(jù)后再進(jìn)行條件判斷 。此時(shí),索引是無(wú)效的,它變成了全表數(shù)據(jù)掃描 。
結(jié)論:使用函數(shù)查詢,索引字段無(wú)效 。
運(yùn)算符使索引無(wú)效 。
mysql> select * from test1 a其中id = 2-1;---| id | name | sex | email |--1 | javacode 1 | 1 | javacode1@163.com |--集合中的1行(0.00秒)MySQL > select * from test1a其中id 1 = 2;--| id | name | sex | email |--| 1 | javacode 1 | 1 | javacode1@163.com |-集合中的一行(2.41秒)
id上有一個(gè)主鍵索引,上面的查詢,第一個(gè)取索引,第二個(gè)不取索引,第二個(gè)用運(yùn)算符 。id所在的索引樹(shù)無(wú)法快速定位要搜索的數(shù)據(jù)所在的頁(yè)面,所以我們只能將所有頁(yè)面的記錄加載到內(nèi)存中,然后計(jì)算每個(gè)數(shù)據(jù)的ID,再判斷是否等于1 。此時(shí),索引是無(wú)效的,它變成了全表數(shù)據(jù)掃描 。

推薦閱讀