MySQL索援用法實例剖析。本站提示廣大學習愛好者:(MySQL索援用法實例剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL索援用法實例剖析正文
本文實例剖析了MySQL索援用法。分享給年夜家供年夜家參考,詳細以下:
MYSQL描寫:
一個文章庫,外面有兩個表:category和article。category外面有10條分類數據。article外面有20萬條。article外面有一個"article_category"字段是與category裡的"category_id"字段絕對應的。article內外面曾經把 article_category字義為了索引。數據庫年夜小為1.3G。
成績描寫:
履行一個很通俗的查詢:
SELECT * FROM `article` WHERE article_category=11 ORDER BY article_id DESC LIMIT 5履行時光年夜約要5秒閣下
處理計劃:
建一個索引: create index idx_u on article (article_category,article_id);
SELECT * FROM `article` WHERE article_category=11 ORDER BY article_id DESC LIMIT 5削減到0.0027秒
持續成績:
SELECT * FROM `article` WHERE article_category IN (2,3) ORDER BY article_id DESC LIMIT 5履行時光要11.2850秒。
應用OR:
select * from article where article_category=2 or article_category=3 order by article_id desc limit 5
履行時光: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
履行時光:0.0261
注:UNION 和UNION ALL 的差別
在數據庫中,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數據庫代碼的時刻,發明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)";
分離履行$sql1 和 $sql2 的時刻成果是對的
然則履行$sql的時刻,發明成果反了,$sql1的部門變升序,$sql2的部門釀成降序
搜刮也沒有獲得滿足的謎底,似乎有些數據庫照樣不支撐字句order by 的
有意中發明如許可以:
$sql = "select * from ($sql1) as temp1 union all select * from ($sql2) as temp2";
這是由於你的union的用法不准確的緣由。在union操作中,order by語句不克不及湧現在由union操作組合的兩個select語句中。排序可以經由過程在第二個select語句後指定order by子句。
願望本文所述對年夜家MySQL數據庫計有所贊助。