中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

mysql多表隨機查詢優化方案
來源:易賢網 閱讀:1726 次 日期:2015-02-12 11:52:14
溫馨提示:易賢網小編為您整理了“mysql多表隨機查詢優化方案”,方便廣大網友查閱!

我以前介紹過最多的就是單表隨機查詢時的優化了,今天 看到一站長分享了一個多表隨機查詢優化的一些方法與方案,下面我們就一起來看看吧.

本文主要談論如何實現Mysql的隨機查詢,多表隨機查詢。在Mysql中隨機取出一條記錄的實現方法。

我們通常的查詢是沒有where或者where fields>2這樣的方式,這樣只能取出在某種條件下的一條或多條,如果條件不變(例如2),那么結果就一直不會有變化。

那么如何實現隨機查詢呢?本人有兩種方法。

方法一、數據表記錄不大的情況下:

select * from `table`

查出來所有的記錄列表,然后array_rand()隨機出一個結果的數組的key。連續的key可以使用mt_rand(1, count($list)); 為什么不使用rand而是mt_rand呢?因為mt_rand幣rand快4倍。

這種情況下,查出整個列表,存入到Memcache的緩存或者Redis的NoSQL中,下次直接取出結果集而不需要查表。不過當數據量一旦超過萬級別,取出列表就很困難了。

方法二:使用SQL語句隨機

MYSQL函數RAND(),產生一個0-1之間的小數,然后MAX(`id`)可以獲得該表中最大的ID。那么MAX(`id`) * RAND()就可以取到表中所有的ID。OK,看語句。

SELECT * FROM `table` WHERE `id` > (SELECT RAND() * (SELECT MAX(`id`) FROM `table`) LIMIT 0, 1

既然MAX(`id`) * MAX(`id`)可以取到表里所有值,那么本語句的WHERE就可以取到本表的所有情況,那么這就是一個所有記錄都有可能被取到的隨機SQL語句。

補充另一篇文章

1. 多表連接類型

1. 笛卡爾積(交叉連接) 在MySQL中可以為CROSS JOIN或者省略CROSS即JOIN,或者使用',' 如:

SELECT * FROM table1 CROSS JOIN table2

SELECT * FROM table1 JOIN table2

SELECT * FROM table1,table2

由于其返回的結果為被連接的兩個數據表的乘積,因此當有WHERE, ON或USING條件的時候一般不建議使用,因為當數據表項目太多的時候,會非常慢。一般使用LEFT [OUTER] JOIN或者RIGHT [OUTER] JOIN

2. 內連接INNER JOIN 在MySQL中把INNER JOIN叫做等值連接,即需要指定等值連接條件在MySQL中CROSS和INNER JOIN被劃分在一起。 join_table: table_reference [INNER | CROSS] JOIN table_factor [join_condition]

3. MySQL中的外連接,分為左外連接和右連接,即除了返回符合連接條件的結果之外,還要返回左表(左連接)或者右表(右連接)中不符合連接條件的結果,相對應的使用NULL對應。

例子:

user表:

id | name

———

1 | libk

2 | zyfon

3 | daodao

user_action表:

user_id | action

—————

1 | jump

1 | kick

1 | jump

2 | run

4 | swim

sql:

select id, name, action from user as u

left join user_action a on u.id = a.user_id

result:

id | name | action

——————————–

1 | libk | jump ①

1 | libk | kick ②

1 | libk | jump ③

2 | zyfon | run ④

3 | daodao | null ⑤

分析:

注意到user_action中還有一個user_id=4, action=swim的紀錄,但是沒有在結果中出現,

而user表中的id=3, name=daodao的用戶在user_action中沒有相應的紀錄,但是卻出現在了結果集中

因為現在是left join,所有的工作以left為準.

結果1,2,3,4都是既在左表又在右表的紀錄,5是只在左表,不在右表的紀錄

工作原理:

從左表讀出一條,選出所有與on匹配的右表紀錄(n條)進行連接,形成n條紀錄(包括重復的行,如:結果1和結果3),如果右邊沒有與on條件匹配的表,那連接的字段都是null.然后繼續讀下一條。

引申:

我們可以用右表沒有on匹配則顯示null的規律, 來找出所有在左表,不在右表的紀錄, 注意用來判斷的那列必須聲明為not null的。

如:

sql:

select id, name, action from user as u

left join user_action a on u.id = a.user_id

where a.user_id is NULL

(注意:

1.列值為null應該用is null 而不能用=NULL

2.這里a.user_id 列必須聲明為 NOT NULL 的.

)

上面sql的result:

id | name | action

————————–

3 | daodao | NULL

——————————————————————————–

一般用法:

a. LEFT [OUTER] JOIN:

除了返回符合連接條件的結果之外,還需要顯示左表中不符合連接條件的數據列,相對應使用NULL對應

SELECT column_name FROM table1 LEFT [OUTER] JOIN table2 ON table1.column=table2.column

b. RIGHT [OUTER] JOIN:

RIGHT與LEFT JOIN相似不同的僅僅是除了顯示符合連接條件的結果之外,還需要顯示右表中不符合連接條件的數據列,相應使用NULL對應

SELECT column_name FROM table1 RIGHT [OUTER] JOIN table2 ON table1.column=table2.column

Tips:

1. on a.c1 = b.c1 等同于 using(c1)

2. INNER JOIN 和 , (逗號) 在語義上是等同的

3. 當 MySQL 在從一個表中檢索信息時,你可以提示它選擇了哪一個索引。

如果 EXPLAIN 顯示 MySQL 使用了可能的索引列表中錯誤的索引,這個特性將是很有用的。

通過指定 USE INDEX (key_list),你可以告訴 MySQL 使用可能的索引中最合適的一個索引在表中查找記錄行。

可選的二選一句法 IGNORE INDEX (key_list) 可被用于告訴 MySQL 不使用特定的索引。如:

mysql> SELECT * FROM table1 USE INDEX (key1,key2)

-> WHERE key1=1 AND key2=2 AND key3=3;

mysql> SELECT * FROM table1 IGNORE INDEX (key3)

-> WHERE key1=1 AND key2=2 AND key3=3;

2. 表連接的約束條件

添加顯示條件WHERE, ON, USING

1. WHERE子句

mysql>

SELECT * FROM table1,table2 WHERE table1.id=table2.id;

2. ON

mysql>

SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id;

SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id

LEFT JOIN table3 ON table2.id=table3.id;

3. USING子句,如果連接的兩個表連接條件的兩個列具有相同的名字的話可以使用USING

例如:

SELECT FROM LEFT JOIN USING ()

連接多于兩個表的情況舉例:

mysql>

SELECT artists.Artist, cds.title, genres.genre

FROM cds

LEFT JOIN genres N cds.genreID = genres.genreID

LEFT JOIN artists ON cds.artistID = artists.artistID;

或者 mysql>

SELECT artists.Artist, cds.title, genres.genre

FROM cds

LEFT JOIN genres ON cds.genreID = genres.genreID

LEFT JOIN artists -> ON cds.artistID = artists.artistID

WHERE (genres.genre = 'Pop');

--------------------------------------------

先過濾條件然后再根據表連接 同時在表中建立相關查詢字段的索引這樣在大數據多表聯合查詢的情況下速度相當快

SELECT M.*,SS.SensorCode,SS.SensorStatus,SS.ManufacturerId,SS.Electricity,

SS.Voltage,SS.MinElectricity,SS.MinVoltage,SS.Temperature,SS.StatusUpdteDate,SS.UpdateStatus ,tp.PricingStrategyid,tps.FreeDuration,bat.BerthTypeId

FROM

(SELECT T.* , BS.ParkStatus,BS.ChangeTime ,CA.CantonName, SE.SectionName

FROM

(SELECT A.* ,B.BerthId,B.BerthCode,B.BerthAddress,B.BerthStatus,B.LineDirection,B.CantonId,B.SectionId

FROM

(SELECT AR.AreaId,AR.AreaCode,AR.AreaName FROM SYS_Area AS AR WHERE 1=1 AND AR.AreaCode='110' ) A

LEFT JOIN SYS_Berth AS B ON B.AreaId=A.AreaId ) T

JOIN SYS_BerthStatus AS BS ON T.BerthCode=BS.BerthCode

JOIN SYS_Canton AS CA ON T.CantonId=CA.CantonId

JOIN SYS_Section AS SE ON T.SectionId=SE.SectionId )M

LEFT JOIN SYS_Sensor SS ON M.BerthCode=SS.BerthCode

LEFT JOIN TRA_PricingBerth AS tp ON tp.BerthCode=M.BerthCode

LEFT JOIN TRA_PricingStrategy AS tps ON tps.PricingStrategyId=tp.PricingStrategyId

LEFT JOIN SYS_BerthAndType AS bat ON bat.BerthCode=M.BerthCode

ORDER BY BerthCode ASC

另外需要注意的地方 在MySQL中涉及到多表查詢的時候,需要根據查詢的情況,想好使用哪種連接方式效率更高。

1. 交叉連接(笛卡爾積)或者內連接 [INNER | CROSS] JOIN

2. 左外連接LEFT [OUTER] JOIN或者右外連接RIGHT [OUTER] JOIN 注意指定連接條件WHERE, ON,USING.

3. MySQL如何優化LEFT JOIN和RIGHT JOIN

在MySQL中,A LEFT JOIN B join_condition執行過程如下:

1)· 根據表A和A依賴的所有表設置表B。

2)· 根據LEFT JOIN條件中使用的所有表(除了B)設置表A。

3)· LEFT JOIN條件用于確定如何從表B搜索行。(換句話說,不使用WHERE子句中的任何條件)。

4)· 可以對所有標準聯接進行優化,只是只有從它所依賴的所有表讀取的表例外。如果出現循環依賴關系,MySQL提示出現一個錯誤。

5)· 進行所有標準WHERE優化。

6)· 如果A中有一行匹配WHERE子句,但B中沒有一行匹配ON條件,則生成另一個B行,其中所有列設置為NULL。

7)· 如果使用LEFT JOIN找出在某些表中不存在的行,并且進行了下面的測試:WHERE部分的col_name IS NULL,其中col_name是一個聲明為 NOT NULL的列,MySQL找到匹配LEFT JOIN條件的一個行后停止(為具體的關鍵字組合)搜索其它行。

RIGHT JOIN的執行類似LEFT JOIN,只是表的角色反過來。

聯接優化器計算表應聯接的順序。LEFT JOIN和STRAIGHT_JOIN強制的表讀順序可以幫助聯接優化器更快地工作,因為檢查的表交換更少。請注意這說明如果執行下面類型的查詢,MySQL進行全掃描b,因為LEFT JOIN強制它在d之前讀取:

SELECT *

FROM a,b LEFT JOIN c ON (c.key=a.key) LEFT JOIN d ON (d.key=a.key)

WHERE b.key=d.key;

在這種情況下修復時用a的相反順序,b列于FROM子句中:

SELECT *

FROM b,a LEFT JOIN c ON (c.key=a.key) LEFT JOIN d ON (d.key=a.key)

WHERE b.key=d.key;

MySQL可以進行下面的LEFT JOIN優化:如果對于產生的NULL行,WHERE條件總為假,LEFT JOIN變為普通聯接。

例如,在下面的查詢中如果t2.column1為NULL,WHERE 子句將為false:

SELECT * FROM t1 LEFT JOIN t2 ON (column1) WHERE t2.column2=5;

因此,可以安全地將查詢轉換為普通聯接:

SELECT * FROM t1, t2 WHERE t2.column2=5 AND t1.column1=t2.column1;

這樣可以更快,因為如果可以使查詢更佳,MySQL可以在表t1之前使用表t2。為了強制使用表順序,使用STRAIGHT_JOIN。

更多信息請查看IT技術專欄

更多信息請查看數據庫
易賢網手機網站地址:mysql多表隨機查詢優化方案
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!

2026上岸·考公考編培訓報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
云南網警備案專用圖標
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
云南網警報警專用圖標
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
国内伊人久久久久久网站视频| 亚洲欧美亚洲| 欧美国产极速在线| 欧美影视一区| 亚洲女女女同性video| 日韩一级在线观看| 最新国产精品拍自在线播放| 在线观看一区视频| 亚洲福利免费| 亚洲国产国产亚洲一二三| 红桃av永久久久| 亚洲成人在线观看视频| 亚洲成人资源网| 亚洲国产精品一区二区久| 亚洲高清一区二| 亚洲精品免费在线| 夜夜躁日日躁狠狠久久88av| 99国产精品99久久久久久粉嫩| 亚洲激情视频在线观看| 日韩一级在线| 亚洲永久免费观看| 欧美一区二区三区日韩| 久久九九有精品国产23| 免费美女久久99| 欧美精品免费播放| 国产精品成人aaaaa网站| 国产精品永久| 国产一区二区三区四区五区美女 | 尤妮丝一区二区裸体视频| 国产午夜精品一区二区三区视频| 国产视频精品va久久久久久| 国产日韩欧美三区| 国产视频在线观看一区| 在线看无码的免费网站| 激情偷拍久久| 亚洲欧洲日产国产网站| 日韩视频第一页| 亚洲美女黄色| 午夜国产精品视频| 欧美freesex8一10精品| 国产精品高潮呻吟久久av无限| 国产欧美短视频| 伊人久久亚洲美女图片| 在线观看成人av电影| 在线观看成人小视频| 亚洲少妇在线| 久久免费视频网| 欧美日韩在线高清| 激情一区二区三区| 欧美主播一区二区三区| 久久不射网站| 欧美日韩喷水| 国内视频一区| 国产精品99久久久久久有的能看| 香蕉尹人综合在线观看| 欧美ed2k| 国产一级久久| 在线午夜精品自拍| 免费观看日韩av| 国产午夜亚洲精品不卡| 日韩一区二区精品| 免费成人黄色| 国内精品视频在线播放| 亚洲一区二区在线播放| 欧美顶级大胆免费视频| 国内精品一区二区| 亚洲欧美日韩在线观看a三区| 免费视频亚洲| 韩国在线一区| 欧美一区二区三区的| 欧美视频在线观看一区| 亚洲国产高清高潮精品美女| 午夜精品久久久久久久久久久 | 在线欧美影院| 亚洲一区国产精品| 欧美精品18+| 欧美色播在线播放| 欧美一区二区久久久| 午夜精品久久久久久久99热浪潮 | 亚洲一区二区免费看| 久久亚洲综合色| 国产日韩欧美精品综合| 亚洲欧美精品中文字幕在线| 欧美国产三区| 在线精品视频一区二区三四| 欧美一区亚洲一区| 国产精自产拍久久久久久| 在线亚洲精品| 欧美日韩国产综合视频在线观看中文| 在线观看亚洲| 欧美fxxxxxx另类| 激情综合色丁香一区二区| 欧美制服丝袜第一页| 国产欧美日韩不卡| 欧美一区二区三区在| 久久综合中文| 国产精品久久久久aaaa九色| 国产亚洲一区二区三区在线观看| 欧美大片在线观看| 欧美精品久久久久a| 久久激情一区| 亚洲激精日韩激精欧美精品| 国产精品一区二区三区久久久| 国产在线观看精品一区二区三区| 久久精品国产第一区二区三区| 亚洲一区免费| 欧美激情一区二区三区不卡| 香蕉免费一区二区三区在线观看 | 亚洲美女在线一区| av成人黄色| 欧美成人精品一区二区| 国产精品一区二区久久精品| 亚洲综合999| 国产精品视屏| 国产欧美精品va在线观看| 小黄鸭视频精品导航| 亚洲精品资源美女情侣酒店| 国产视频久久久久| 欧美激情视频一区二区三区不卡| 国产精品一二三四区| 久久久久国色av免费看影院| 欧美日韩亚洲综合在线| 国产自产v一区二区三区c| 亚洲第一网站免费视频| 性做久久久久久免费观看欧美| 男人天堂欧美日韩| 国产精品一级| 欧美日韩免费一区二区三区视频| 久久国产高清| 久久久久网站| 国产精品久久久久77777| 亚洲福利视频免费观看| 亚洲欧美激情一区| 欧美色图一区二区三区| 久久偷窥视频| 久久人91精品久久久久久不卡| 亚洲激情av在线| 国产精品入口夜色视频大尺度| 久久免费精品日本久久中文字幕| 99国产精品视频免费观看一公开| 国产网站欧美日韩免费精品在线观看| 免费一级欧美片在线观看| 亚洲香蕉成视频在线观看| 又紧又大又爽精品一区二区| 国产精品s色| 欧美成人精品三级在线观看| 日韩亚洲不卡在线| 国产精品热久久久久夜色精品三区| 狠狠色香婷婷久久亚洲精品| 久久久久国产一区二区三区四区| 国产日韩综合一区二区性色av| 可以免费看不卡的av网站| 一区精品在线| 免费观看在线综合色| 亚洲精品美女免费| 国产一区二区三区av电影| 久久久91精品| 一本一道久久综合狠狠老精东影业| 欧美好吊妞视频| 亚洲欧美国产一区二区三区| 在线免费观看欧美| 国产日韩精品一区观看 | 国产精品一区二区在线观看| 亚洲精品国产系列| 国产精品婷婷| 久久国产66| 黑人一区二区三区四区五区| 久久天天躁夜夜躁狠狠躁2022| 亚洲国产cao| 日韩视频在线一区二区| 欧美有码在线视频| 中文欧美字幕免费| 欧美人体xx| 欧美高清视频一二三区| 久久亚洲精品伦理| 久久久久久久网站| 午夜视频一区| 欧美一级艳片视频免费观看| 亚洲永久视频| 亚洲欧美怡红院| 性欧美8khd高清极品| 99精品久久久| 亚洲国产天堂久久综合| 激情久久久久久久| 国产一区二区三区奇米久涩| 国产亚洲一区二区精品| 欧美视频日韩| 国产精品热久久久久夜色精品三区 | 国产日韩精品一区观看| 欧美精品日韩三级| 欧美激情一区二区三区蜜桃视频 | 欧美成人69| 欧美激情导航| 欧美三级黄美女| 国产精品久久久久三级| 国产九九精品| 国产主播一区二区三区| 亚洲第一天堂av| 亚洲免费大片| 国产亚洲精品一区二区|