本文實例講述了mysql優(yōu)化小技巧之去除重復項實現(xiàn)方法。分享給大家供大家參考,具體如下:
說到這個去重,腦仁不禁得一疼,尤其是出具量比較大的時候。畢竟咱不是專業(yè)的DB,所以嘞,只能自己弄一下適合自己去重方法了。
首先按照常規(guī)首段,使用having函數(shù)檢查重復項,完事一個一個的刪除。不要問我having檢測重復項的sql咋寫,你懂得哈。。。這個在只有幾條重復的時候還可以。要是幾千上萬條不同數(shù)據(jù)重復,那咋辦。。。
完事呢,咱就考慮了,用having函數(shù)查詢的時候,原始sql如下:
select `name`,count(*) as count from sentence group by `name` having count>1
大家可以運行感覺下,在五百萬左右的數(shù)據(jù)時,那速度,麻油。。。
但是嘞,咱在不考慮優(yōu)化它的運行速度的前提下,來考慮使用這個語句來使我們?nèi)コ龜?shù)組中的重復項。首先,我們要知道,我們刪除重復數(shù)據(jù)的時候需要使用的數(shù)據(jù)有哪些。id是肯定的,再來呢,篩選的條件是吧。所以嘞,上面的sql查詢出來的數(shù)據(jù),缺少了啥,id。。。那我們加上這個字段查詢下試試哈:
select id,`name`,count(*) as count from sentence group by `name` having count>1
結果呢,就會顯示出來id,name,count這三個字段。具體效果大家可以自己運行看下。根據(jù)這些數(shù)據(jù)咱們就可以進行去除重復項的操作了。
具體的sql設計就是刪除id不是咱們查詢出來的id,但是name值是咱們查詢出來的值,因為咱們的數(shù)據(jù)不是一條,所以得經(jīng)過程序處理,把所有的id用逗號拼接起來,name值用引號和逗號處理下,完事就可以進行使用了,示例呢就在下方:
delete from sentence where id not in(1,2,3) and name in('a','b','c')
如果數(shù)據(jù)過多的話,咱們可以寫成腳本,完事再進行分批次操作。嘿嘿,到了這里,咱們就可以進行去除重復項的操作了,但是這個速度么,始終是個困擾。接下來咱們就要考慮如何來優(yōu)化這個sql,讓它的速度上去,就算是大功告成了。
既然是提升咱們sql的運行速度,按照常理來講,首先應該想到的那就是索引。好唄,廢話不多說,咱們先建立索引。但是給那個字段建立所以呢???這又是個問題了。
這個原則上是在你name字段可以加以區(qū)分的字段上建立的。比如,我的name字段里面儲存的是一條條的品牌名稱,然后呢,我有一個industry字段是來存儲每個品牌的行業(yè)的,所以我就在我的industry字段上建立了索引。當然,還有更加合適的,這個就看大家咋考慮了。廢話不多說,咱直接來看看我們優(yōu)化后的sql:
select id,`name`,count(*) as count from sentence where industry = '飲品' group by `name` having count>1
運行結果如下:
結果說明啥,說明咱們的索引有在使用哦。。。那速度,咱不說各位看官應該也了解。完事咱們就可以再用程序把所有的id用逗號拼接起來,name值用引號和逗號處理下,完事就可以進行那個去除重復項的大業(yè)了。效率明顯上升啊。。。
不過有的看官可能用的條件里面含有l(wèi)ike等會使索引失效的條件,那咱們還可以,把數(shù)據(jù)簡單分類,完事分別檢測每個分類的數(shù)據(jù),全部查詢出來后,可以使用程序來檢查重復項,并且取出刪除所需要的數(shù)據(jù)。
附:mysql rand查詢優(yōu)化隨機查詢優(yōu)化
說起這個隨機查詢,大家都知道使用rand()函數(shù),但是當數(shù)據(jù)量達到一定程度的時候,查詢效率就可想而知了。所以呢?我們不妨考慮下優(yōu)化這個查詢方案。
我的優(yōu)化方式為,通過程序來隨機,再配合limit來取值。咱們記錄下大概思路哈。
首先查詢出符合條件的數(shù)據(jù)條數(shù),之后用PHP的rand函數(shù)來在這個數(shù)值范圍內(nèi)隨機取值,之后直接查詢就可以。
示例sql:
select count(*) from test where $where;
(計算所需要的數(shù)據(jù)的總條數(shù))
$offset = rand(0,$count)
select * from test where $where limit $offset,1;
(查詢出所需數(shù)據(jù))
大家可以動手試試。五百萬左右的數(shù)據(jù)情況下,查詢速度較之mysql的rand函數(shù)查詢方式快了最少十倍。
好啦,本次分享就到這里了。
更多關于MySQL相關內(nèi)容感興趣的讀者可查看本站專題:《MySQL查詢技巧大全》、《MySQL常用函數(shù)大匯總》、《MySQL日志操作技巧大全》、《MySQL事務操作技巧匯總》、《MySQL存儲過程技巧大全》及《MySQL數(shù)據(jù)庫鎖相關技巧匯總》
希望本文所述對大家MySQL數(shù)據(jù)庫計有所幫助。
您可能感興趣的文章:- 解析mysql中:單表distinct、多表group by查詢?nèi)コ貜陀涗?/li>
- mysql SELECT語句去除某個字段的重復信息
- MySQL 去除重復數(shù)據(jù)實例詳解
- 一條sql語句完成MySQL去重留一
- MySQL去重的方法整理
- mysql 開發(fā)技巧之JOIN 更新和數(shù)據(jù)查重/去重
- Mysql刪除重復的數(shù)據(jù) Mysql數(shù)據(jù)去重復
- mysql去重的兩種方法詳解及實例代碼
- MySQL數(shù)據(jù)表合并去重的簡單實現(xiàn)方法
- 將MySQL去重操作優(yōu)化到極致的操作方法
- mysql自聯(lián)去重的一些筆記記錄