《Mysql必讀MySQL中索引優(yōu)化distinct語(yǔ)句及distinct的多字段操作》要點(diǎn):
本文介紹了Mysql必讀MySQL中索引優(yōu)化distinct語(yǔ)句及distinct的多字段操作,希望對(duì)您有用。如果有疑問(wèn),可以聯(lián)系我們。
MySQL通常使用GROUPBY(本質(zhì)上是排序動(dòng)作)完成DISTINCT操作,如果DISTINCT操作和ORDERBY操作組合使用,通常會(huì)用到臨時(shí)表.這樣會(huì)影響性能. 在一些情況下,MySQL可以使用索引優(yōu)化DISTINCT操作,但需要活學(xué)活用.本文涉及一個(gè)不能利用索引完成DISTINCT操作的實(shí)例.MYSQL入門
?MYSQL入門
實(shí)例1 使用索引優(yōu)化DISTINCT操作MYSQL入門
create table m11 (a int, b int, c int, d int, primary key(a)) engine=INNODB; insert into m11 values (1,1,1,1),(2,2,2,2),(3,3,3,3),(4,4,4,4),(5,5,5,5),(6,6,6,6),(7,7,7,7),(8,8,8,8); explain select distinct(a) from m11;
mysql> explain select distinct(a) from m11;
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+| 1 | SIMPLE | m11 | NULL | index | PRIMARY | PRIMARY | 4 | NULL | 1 | 100.00 | Using index |+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+MYSQL入門
2 這是使用索引優(yōu)化DISTINCT操作的典型實(shí)例.MYSQL入門
?MYSQL入門
實(shí)例2 使用索引不能優(yōu)化DISTINCT操作MYSQL入門
create table m31 (a int, b int, c int, d int, primary key(a)) engine=MEMORY; insert into m31 values (1,1,1,1),(2,2,2,2),(3,3,3,3),(4,4,4,4),(5,5,5,5),(6,6,6,6),(7,7,7,7),(8,8,8,8); explain select distinct(a) from m31;
mysql> explain select distinct(a) from m31;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+| 1 | SIMPLE | m31 | NULL | ALL | NULL | NULL | NULL | NULL | 8 | 100.00 | NULL |+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+MYSQL入門
2 對(duì)比實(shí)例1的建表語(yǔ)句,只是存儲(chǔ)引擎不同.MYSQL入門
3 為什么主鍵索引沒(méi)有起作用? 難道MEMORY存儲(chǔ)引擎上的索引不可使用?MYSQL入門
?MYSQL入門
實(shí)例3 使用索引可以優(yōu)化DISTINCT操作的Memory表MYSQL入門
create table m33 (a int, b int, c int, d int, INDEX USING BTREE (a)) engine=MEMORY; insert into m33 values (1,1,1,1),(2,2,2,2),(3,3,3,3),(4,4,4,4),(5,5,5,5),(6,6,6,6),(7,7,7,7),(8,8,8,8); explain select distinct(a) from m33;
?MYSQL入門
mysql> explain select distinct(a) from m33;
+----+-------------+-------+------------+-------+---------------+------+---------+------+------+----------+-------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+----+-------------+-------+------------+-------+---------------+------+---------+------+------+----------+-------+| 1 | SIMPLE | m33 | NULL | index | NULL | a | 5 | NULL | 8 | 100.00 | NULL |+----+-------------+-------+------------+-------+---------------+------+---------+------+------+----------+-------+
說(shuō)明:
1 'a'列上存在主鍵索引,MySQL可以利用索引(key列值表明使用了主鍵索引)完成了DISTINCT操作.MYSQL入門
2 對(duì)比實(shí)例2,可以發(fā)現(xiàn),二者都使用了Memory引擎. 但實(shí)例3指名使用Btree類型的索引.MYSQL入門
3 實(shí)例2沒(méi)有指定使用什么類型的索引,MySQL將采用默認(rèn)值. MySQL手冊(cè)上說(shuō):MYSQL入門
As indicated by the engine name, MEMORY tables are stored in memory. They use hash indexes by default, which makes them very fast for single-value lookups, and very useful for creating temporary tables.MYSQL入門
?MYSQL入門
結(jié)論:MYSQL入門
1 看索引對(duì)查詢的影響,要注意索引的類型.MYSQL入門
2 HASH索引適合等值查找,但不適合需要有序的場(chǎng)景,而Btree卻適合有序的場(chǎng)景.MYSQL入門
3 看查詢執(zhí)行計(jì)劃,發(fā)現(xiàn)索引沒(méi)有被使用,需要進(jìn)一步考察索引的類型.MYSQL入門
?MYSQL入門
DISTINCT不能選擇多個(gè)字段的解決方法
在實(shí)際應(yīng)用中,我們經(jīng)常要選擇數(shù)據(jù)庫(kù)某表中重復(fù)數(shù)據(jù),通常我們是使用DISTINCT函數(shù).MYSQL入門
但DISTINCT只能對(duì)一個(gè)字段有效,比如:MYSQL入門
sql="select DISTINCT title from Table where id>0"
當(dāng)我們需要列出數(shù)據(jù)中的另一列,比如:MYSQL入門
sql="select DISTINCT title,posttime from Table where id>0"
得出的結(jié)果就不是我們想要的了,所以我們需要用另外的方法來(lái)解決這個(gè)問(wèn)題.MYSQL入門
下面的是我寫的SQL語(yǔ)句,我不知道是不是很好,但愿有更好的人拿出來(lái)分享一下:MYSQL入門
寫法一:MYSQL入門
sql = "Select DISTINCT(title),posttime From Table1 Where id>0"
寫法二:MYSQL入門
sql = "Select title,posttime From Table1 Where id>0 group by title,posttime"
寫法三:MYSQL入門
sql="select title,posttime from Table where id in (select min(id) from Table group by title)"
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.snjht.com/jiaocheng/1161.html