MYSQL子查詢和嵌套查詢優(yōu)化實(shí)例解析
查詢游戲歷史成績(jī)最高分前100
Sql代碼
SELECT ps.* FROM cdb_playsgame ps WHERE ps.credits=(select MAX(credits) FROM cdb_playsgame ps1 where ps.uid=ps1.uid AND ps.gametag=ps1.gametag) AND ps.gametag='yeti3' GROUP BY ps.uid order by ps.credits desc LIMIT 100;
Sql代碼
SELECT ps.* FROM cdb_playsgame ps,(select ps1.uid, ps1.gametag, MAX(credits) as credits FROM cdb_playsgame ps1 group by uid,gametag) t WHERE ps.credits=t.credits AND ps.uid=t.uid AND ps.gametag=t.gametag AND ps.gametag='yeti3' GROUP BY ps.uid order by ps.credits desc LIMIT 100;
執(zhí)行時(shí)間僅為0.22秒,比原來(lái)的25秒提高了10000倍
查詢當(dāng)天游戲最好成績(jī)
Sql代碼
SELECT ps. * , mf. * , m.username FROM cdb_playsgame ps LEFT JOIN cdb_memberfields mf ON mf.uid = ps.uid LEFT JOIN cdb_members m ON m.uid = ps.uid WHERE ps.gametag = 'chuansj' AND FROM_UNIXTIME( ps.dateline, '%Y%m%d' ) = '20081008' AND ps.credits = ( SELECT MAX( ps1.credits ) FROM cdb_playsgame ps1 WHERE ps.uid = ps1.uid AND ps1.gametag = 'chuansj' AND FROM_UNIXTIME( ps1.dateline, '%Y%m%d' ) = '20081008' ) GROUP BY ps.uid ORDER BY credits DESC LIMIT 0 , 50
像查詢里:
AND ps.credits=(SELECT MAX(ps1.credits)
FROM {$tablepre}playsgame ps1 where ps.uid=ps1.uid AND ps1.gametag = '$game'
AND FROM_UNIXTIME(ps1.dateline, '%Y%m%d') = '$todaytime' )
特別消耗時(shí)間
另外,像:
FROM_UNIXTIME(ps1.dateline, '%Y%m%d') = '$todaytime'
這樣的語(yǔ)句會(huì)導(dǎo)致索引無(wú)效,因?yàn)閷?duì)每個(gè)dataline的值都需要用函數(shù)計(jì)算一遍,需要調(diào)整為:
Sql代碼
AND ps1.dateline >= UNIX_TIMESTAMP('$todaytime')
//更改后
Sql代碼
SELECT ps. * , mf. * , m.username FROM cdb_playsgame ps, cdb_memberfields mf, cdb_members m, ( SELECT ps1.uid, MAX( ps1.credits ) AS credits FROM cdb_playsgame ps1 WHERE ps1.gametag = 'chuansj' AND ps1.dateline >= UNIX_TIMESTAMP( '20081008' ) GROUP BY ps1.uid ) AS t WHERE mf.uid = ps.uid AND m.uid = ps.uid AND ps.gametag = 'chuansj' AND ps.credits = t.credits AND ps.uid = t.uid GROUP BY ps.uid ORDER BY credits DESC LIMIT 0 , 50
對(duì)于每個(gè)球員,找出球員號(hào)碼,名字以及他所引起的罰款的號(hào)碼,但只是針對(duì)那些至少有兩次罰款的球員。
更緊湊的查詢,在FROM子句中放置一個(gè)子查詢。
Sql代碼
SELECT PLAYERNO,NAME,NUMBER
FROM (SELECT PLAYERNO,NAME,
(SELECT COUNT(*)
FROM PENALTIES
WHERE PENALTIES.PLAYERNO =
PLAYERS.PLAYERNO)
AS NUMBER
FROM PLYERS) AS PN
WHERE NUMBER>=2
FROM子句中的子查詢決定了每個(gè)球員的號(hào)碼,名字和罰款的編號(hào)。接下來(lái),這個(gè)號(hào)碼變成了中間結(jié)果中的一列。然后指定了一個(gè)條件(NUMBER>=2);最后,獲取SELECT子句中的列。
總結(jié)
以上就是本文關(guān)于MYSQL子查詢和嵌套查詢優(yōu)化實(shí)例解析的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以參閱:mysql in語(yǔ)句子查詢效率慢的優(yōu)化技巧示例、淺談mysql的子查詢聯(lián)合與in的效率等,如有不足之處請(qǐng)留言,小編會(huì)及時(shí)更正。
感謝朋友們對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
mysql ON DUPLICATE KEY UPDATE語(yǔ)句示例
本文介紹一下關(guān)于mysql中INSERT INTO… ON DUPLICATE KEY UPDATE用法2013-11-11
Windows中MySQL數(shù)據(jù)庫(kù)下載以及安裝教程(最最新版)
這篇文章主要給大家介紹了關(guān)于Windows中MySQL數(shù)據(jù)庫(kù)下載以及安裝的相關(guān)資料,很多朋友剛開始接觸mysql數(shù)據(jù)庫(kù)服務(wù)器,對(duì)安裝使用教程不太明白,這里給大家總結(jié)下,需要的朋友可以參考下2023-09-09
面試中老生常談的MySQL問(wèn)答集錦夯實(shí)基礎(chǔ)
這篇文章主要為大家介紹了面試中老生常談的MySQL問(wèn)答集錦,不僅可以幫助大家順利通過(guò)面試更可以夯實(shí)大家的基礎(chǔ),有需要的朋友可以借鑒參考下2022-03-03
Mysql使用sum()函數(shù)返回null的問(wèn)題詳解
MySQL的Sum()函數(shù)是用來(lái)找出所有記錄的一個(gè)字段的總和,下面這篇文章主要給大家介紹了關(guān)于Mysql使用sum()函數(shù)返回null的問(wèn)題,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-01-01
MySQL中的基本查詢語(yǔ)句學(xué)習(xí)筆記
這篇文章主要介紹了MySQL中的基本查詢語(yǔ)句學(xué)習(xí)筆記,包括使用limit限制查詢結(jié)果條數(shù)和合并查詢結(jié)果的方法,需要的朋友可以參考下2016-03-03
深入理解MySQL的數(shù)據(jù)庫(kù)引擎的類型
本篇文章是對(duì)MySQL的數(shù)據(jù)庫(kù)引擎的類型進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
MYSQL中有關(guān)SUM字段按條件統(tǒng)計(jì)使用IF函數(shù)(case)問(wèn)題
MYSQL中SUM字段按條件統(tǒng)計(jì)使用IF函數(shù),具體實(shí)現(xiàn)代碼如下,感興趣的朋友不要錯(cuò)過(guò)2014-01-01
Linux下啟動(dòng)多個(gè)mysql服務(wù)器例子
這篇文章主要介紹了Linux下啟動(dòng)多個(gè)mysql服務(wù)器例子,本文還包括了3個(gè)可能遇到的問(wèn)題及解決方法,需要的朋友可以參考下2014-07-07
安裝MySQL 5后無(wú)法啟動(dòng)(不能Start service)解決方法小結(jié)
有時(shí)候我們?cè)诎惭bmysql軟件時(shí),卻無(wú)法啟動(dòng),或服務(wù)器安全設(shè)置以后都可能導(dǎo)致mysql無(wú)法運(yùn)行2012-07-07
linux下mysql5.7.17最新穩(wěn)定版本安裝教程
這篇文章主要為大家詳細(xì)介紹了linux上mysql5.7.17最新穩(wěn)定版本安裝教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02

