MySQL索引用法實(shí)例分析
本文實(shí)例分析了MySQL索引用法。分享給大家供大家參考,具體如下:
MYSQL描述:
一個(gè)文章庫(kù),里面有兩個(gè)表:category和article。category里面有10條分類(lèi)數(shù)據(jù)。article里面有20萬(wàn)條。article里面有一個(gè)"article_category"字段是與category里的"category_id"字段相對(duì)應(yīng)的。article表里面已經(jīng)把 article_category字義為了索引。數(shù)據(jù)庫(kù)大小為1.3G。
問(wèn)題描述:
執(zhí)行一個(gè)很普通的查詢:
解決方案:
建一個(gè)索引:
繼續(xù)問(wèn)題:
使用OR:
select * from article where article_category=2 or article_category=3 order by article_id desc limit 5
執(zhí)行時(shí)間:11.0777
解決方案:避免使用in 或者 or (or會(huì)導(dǎo)致掃表),使用union all
使用UNION ALL:
(select * from article where article_category=2 order by article_id desc limit 5) UNION ALL (select * from article where article_category=3 order by article_id desc limit 5) ORDER BY article_id desc limit 5
執(zhí)行時(shí)間:0.0261
注:UNION 和UNION ALL 的區(qū)別
在數(shù)據(jù)庫(kù)中,UNION和UNION ALL關(guān)鍵字都是將兩個(gè)結(jié)果集合并為一個(gè),但這兩者從使用和效率上來(lái)說(shuō)都有所不同。
UNION在進(jìn)行表鏈接后會(huì)篩選掉重復(fù)的記錄,所以在表鏈接后會(huì)對(duì)所產(chǎn)生的結(jié)果集進(jìn)行排序運(yùn)算,刪除重復(fù)的記錄再返回結(jié)果。
實(shí)際大部分應(yīng)用中是不會(huì)產(chǎn)生重復(fù)的記錄,最常見(jiàn)的是過(guò)程表與歷史表UNION。如:
select * from gc_dfys union select * from ls_jg_dfys
這個(gè)SQL在運(yùn)行時(shí)先取出兩個(gè)表的結(jié)果,再用排序空間進(jìn)行排序刪除重復(fù)的記錄,最后返回結(jié)果集,如果表數(shù)據(jù)量大的話可能會(huì)導(dǎo)致用磁盤(pán)進(jìn)行排序。
而UNION ALL只是簡(jiǎn)單的將兩個(gè)結(jié)果合并后就返回。這樣,如果返回的兩個(gè)結(jié)果集中有重復(fù)的數(shù)據(jù),那么返回的結(jié)果集就會(huì)包含重復(fù)的數(shù)據(jù)了。
從效率上說(shuō),UNION ALL 要比UNION快很多,所以,如果可以確認(rèn)合并的兩個(gè)結(jié)果集中不包含重復(fù)的數(shù)據(jù)的話,那么就使用UNION ALL,如下:
select * from gc_dfys union all select * from ls_jg_dfys
注:mysql中union all的order by問(wèn)題
今天寫(xiě)mysql數(shù)據(jù)庫(kù)代碼的時(shí)候,發(fā)現(xiàn)union的結(jié)果不是預(yù)期的
$stime = date("H:i:s"); $sql1 = "select * from T where '$stime'>stime order by stime desc"; $sql2 = "select * from T where stime>'$stime' order by stime asc"; $sql = "($sql) union all ($sql2)";
分別執(zhí)行$sql1 和 $sql2 的時(shí)候結(jié)果是對(duì)的
但是執(zhí)行$sql的時(shí)候,發(fā)現(xiàn)結(jié)果反了,$sql1的部分變升序,$sql2的部分變成降序
搜索也沒(méi)有得到滿意的答案,好像有些數(shù)據(jù)庫(kù)還是不支持字句order by 的
無(wú)意中發(fā)現(xiàn)這樣可以:
這是因?yàn)槟愕膗nion的用法不正確的原因。在union操作中,order by語(yǔ)句不能出現(xiàn)在由union操作組合的兩個(gè)select語(yǔ)句中。排序可以通過(guò)在第二個(gè)select語(yǔ)句后指定order by子句。
更多關(guān)于MySQL相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《MySQL索引操作技巧匯總》、《MySQL日志操作技巧大全》、《MySQL事務(wù)操作技巧匯總》、《MySQL存儲(chǔ)過(guò)程技巧大全》、《MySQL數(shù)據(jù)庫(kù)鎖相關(guān)技巧匯總》及《MySQL常用函數(shù)大匯總》
希望本文所述對(duì)大家MySQL數(shù)據(jù)庫(kù)計(jì)有所幫助。
相關(guān)文章
ubuntu安裝mysql數(shù)據(jù)庫(kù)方法
ubuntu基于linux的免費(fèi)開(kāi)源桌面PC操作系統(tǒng),十分契合英特爾的超極本定位,支持x86、64位和ppc架構(gòu)。這篇文章給大家介紹ubuntu安裝mysql數(shù)據(jù)庫(kù)方法,非常不錯(cuò),需要的朋友參考下吧2019-08-08Mysql 8 新特性 window functions 的作用
MySQL是眾多網(wǎng)站技術(shù)棧中的標(biāo)準(zhǔn)配置,是廣受歡迎的開(kāi)源數(shù)據(jù)庫(kù),已經(jīng)推出了8.0的第一個(gè)候選發(fā)行版本。接下來(lái)通過(guò)本文給大家分享Mysql 8 新特性 window functions 的作用,需要的朋友參考下吧2017-11-11在MySQL數(shù)據(jù)庫(kù)中復(fù)位根用戶的密碼的方法
2007-12-12MySQL定時(shí)刪除XX天數(shù)據(jù)示例代碼
通過(guò)使用MySQL的事件調(diào)度器,我們可以方便地創(chuàng)建定時(shí)任務(wù)來(lái)定期清理數(shù)據(jù)庫(kù)中的過(guò)期數(shù)據(jù),本文介紹了如何創(chuàng)建定時(shí)任務(wù)以及如何刪除3個(gè)月前的數(shù)據(jù)作為示例,感興趣的朋友跟隨小編一起看看吧2023-09-09