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

