mysql - 一個(gè)sql的問(wèn)題
問(wèn)題描述
stat表 字段 uid,act,time我想取出每個(gè)uid最近的一個(gè)act我現(xiàn)在的sql:
select * from (select * from stat order by uid,time desc) a group by uid
這個(gè)表數(shù)據(jù)量比較大,查起來(lái)有點(diǎn)慢,有沒(méi)有更好的辦法
甚至這個(gè):
select act,count(*) num from (select * from (select * from stat order by uid,time desc) a group by uid) b group by act
表:
CREATE TABLE `stat` ( `uid` varchar(40) COLLATE utf8_unicode_ci NOT NULL, `act` bigint(20) NOT NULL, `time` bigint(20) DEFAULT NULL, PRIMARY KEY (`uid`,`act`), KEY `index_time` (`time`) USING BTREE, KEY `index_act` (`act`) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
問(wèn)題解答
回答1:先說(shuō)一下我的看法吧,如果有錯(cuò)誤的地方,歡迎指正。首先,我覺(jué)得題主的SQL語(yǔ)句是錯(cuò)的,看起來(lái)結(jié)果正確只不過(guò)是寄希望于數(shù)據(jù)庫(kù)在執(zhí)行g(shù)roup by的實(shí)現(xiàn)機(jī)制。比如說(shuō)如果把排序順序變一下結(jié)果就錯(cuò)了。在使用group by之后,題主能夠查詢的字段要么是在聚集函數(shù)里面,要么就是group by的字段,類似于’select * from a group by uid’這樣的寫法不規(guī)范,因?yàn)閿?shù)據(jù)庫(kù)在按照uid分組之后,會(huì)隨機(jī)選取一組act和time的字段值。題主的SQL看起來(lái)工作正常應(yīng)該是在排序之后,數(shù)據(jù)庫(kù)默認(rèn)選取了排序最靠前的。我認(rèn)為正確的SQL應(yīng)該是這樣的:
select stat.* from stat ,(select uid,max(time) as time from stat group by uid) tmp where stat.uid=tmp.uid and stat.time=tmp.time;
先分組查詢出每個(gè)人執(zhí)行時(shí)間最晚的時(shí)間,然后根據(jù)uid和time去獲取完整的操作信息。如果題主的數(shù)據(jù)庫(kù)對(duì)uid加了索引的話,這個(gè) SQL的查詢效率應(yīng)該還在可以接受的程度。一點(diǎn)個(gè)人看法。
我在原來(lái)的基礎(chǔ)之上,做了一丟丟修改,在本地測(cè)試性能有微小的提升,我本地是三萬(wàn)組測(cè)試數(shù)據(jù),題主可以試一下:
select stat.* from stat ,(select uid,max(time) as time from stat group by uid order by null) tmp where stat.time=tmp.time and stat.uid=tmp.uid;回答2:
給查詢條件的那幾個(gè)列建立索引試試,B數(shù)索引呀,B+數(shù)索引呀等等
具體怎么建立你可以去百度搜一下
回答3:這個(gè)語(yǔ)句為什么要嵌套子查詢,一條語(yǔ)句不行嗎,不是很清楚邏輯,,,不過(guò)正常情況下我都是用explain打印一下查詢信息
回答4:一條group by就足夠了為什么要寫兩層
相關(guān)文章:
1. mysql如何配置遠(yuǎn)程php外網(wǎng)鏈接數(shù)據(jù)庫(kù)2. 老師 我是一個(gè)沒(méi)有學(xué)過(guò)php語(yǔ)言的準(zhǔn)畢業(yè)生 我希望您能幫我一下3. mysql - eclispe無(wú)法打開(kāi)數(shù)據(jù)庫(kù)連接4. mysql 5萬(wàn)張表 導(dǎo)出成sql 不要內(nèi)容,只要結(jié)構(gòu),非常慢。如何解決啊?5. 導(dǎo)入數(shù)據(jù)庫(kù)不成功6. 數(shù)據(jù)庫(kù) - mysql中有沒(méi)查看數(shù)據(jù)大小的函數(shù)??7. PHP單例模式8. mysql如何判斷數(shù)據(jù)不存在則插入呢?9. mysql - 關(guān)于數(shù)據(jù)緩存策略方面的疑惑10. mysql無(wú)法刪除字段(錯(cuò)誤1091),但是對(duì)該字段設(shè)置主鍵后就可刪除,為什么?
