程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL索援用法實例剖析

MySQL索援用法實例剖析

編輯:MySQL綜合教程

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數據庫計有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved