MySQL索引用法實(shí)例分析
本文實(shí)例分析了MySQL索引用法。分享給大家供大家參考,具體如下:
MYSQL描述:
一個(gè)文章庫,里面有兩個(gè)表:category和article。category里面有10條分類數(shù)據(jù)。article里面有20萬條。article里面有一個(gè)"article_category"字段是與category里的"category_id"字段相對(duì)應(yīng)的。article表里面已經(jīng)把 article_category字義為了索引。數(shù)據(jù)庫大小為1.3G。
問題描述:
執(zhí)行一個(gè)很普通的查詢:
解決方案:
建一個(gè)索引:
繼續(xù)問題:
使用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ù)庫中,UNION和UNION ALL關(guān)鍵字都是將兩個(gè)結(jié)果集合并為一個(gè),但這兩者從使用和效率上來說都有所不同。
UNION在進(jìn)行表鏈接后會(huì)篩選掉重復(fù)的記錄,所以在表鏈接后會(huì)對(duì)所產(chǎn)生的結(jié)果集進(jìn)行排序運(yùn)算,刪除重復(fù)的記錄再返回結(jié)果。
實(shí)際大部分應(yīng)用中是不會(huì)產(chǎn)生重復(fù)的記錄,最常見的是過程表與歷史表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)致用磁盤進(jìn)行排序。
而UNION ALL只是簡單的將兩個(gè)結(jié)果合并后就返回。這樣,如果返回的兩個(gè)結(jié)果集中有重復(fù)的數(shù)據(jù),那么返回的結(jié)果集就會(huì)包含重復(fù)的數(shù)據(jù)了。
從效率上說,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問題
今天寫mysql數(shù)據(jù)庫代碼的時(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的部分變成降序
搜索也沒有得到滿意的答案,好像有些數(shù)據(jù)庫還是不支持字句order by 的
無意中發(fā)現(xiàn)這樣可以:
這是因?yàn)槟愕膗nion的用法不正確的原因。在union操作中,order by語句不能出現(xiàn)在由union操作組合的兩個(gè)select語句中。排序可以通過在第二個(gè)select語句后指定order by子句。
更多關(guān)于MySQL相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《MySQL索引操作技巧匯總》、《MySQL日志操作技巧大全》、《MySQL事務(wù)操作技巧匯總》、《MySQL存儲(chǔ)過程技巧大全》、《MySQL數(shù)據(jù)庫鎖相關(guān)技巧匯總》及《MySQL常用函數(shù)大匯總》
希望本文所述對(duì)大家MySQL數(shù)據(jù)庫計(jì)有所幫助。
相關(guān)文章
Navicat for MySQL(mysql圖形化管理工具)是什么?
這里就給大家介紹一個(gè)常用的MySQL數(shù)據(jù)庫管理工具:Navicat for MySQL,需要的朋友可以參考下2015-09-09
MySQL中動(dòng)態(tài)生成SQL語句去掉所有字段的空格的操作方法
在數(shù)據(jù)庫管理過程中,我們常常會(huì)遇到需要對(duì)表中字段進(jìn)行清洗和整理的情況,本文將詳細(xì)介紹如何在MySQL中動(dòng)態(tài)生成SQL語句來去掉所有字段的空格,感興趣的朋友一起看看吧2025-04-04
mysql字符集引起的java.sql.SQLException:Incorrect?string?value:問題
文章主要介紹了在MySQL數(shù)據(jù)庫中插入生僻字和emoji表情包時(shí)遇到的字符編碼問題,解釋了utf8和utf8mb4的區(qū)別,并提供了修改數(shù)據(jù)庫編碼格式和更改MySQL參數(shù)的解決方案2024-11-11
Mysql?索引?BTree?與?B+Tree?的區(qū)別(面試)
這篇文章主要介紹了Mysql索引BTree與B+Tree的區(qū)別,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09
window上驗(yàn)證mysql是否安裝成功的操作過程
這篇文章主要介紹了window上驗(yàn)證mysql是否安裝成功,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-08-08

