select * from orders_history where type=8 limit 100000,1;select id from orders_history where type=8 limit 100000,1;select * from orders_history where type=8 and id>=(select id from orders_history where type=8 limit 100000,1) limit 100;select * from orders_history where type=8 limit 100000,100;4條語句的查詢時(shí)間如下:
第1條語句:3674ms第2條語句:1315ms第3條語句:1327ms第4條語句:3710ms
針對上面的查詢需要注意:
比較第1條語句和第2條語句:使用 select id 代替 select * 速度增加了3倍比較第2條語句和第3條語句:速度相差幾十毫秒比較第3條語句和第4條語句:得益于 select id 速度增加,第3條語句查詢速度增加了3倍這種方式相較于原始一般的查詢方法,將會增快數(shù)倍 。
使用 id 限定優(yōu)化
這種方式假設(shè)數(shù)據(jù)表的id是連續(xù)遞增的,則我們根據(jù)查詢的頁數(shù)和查詢的記錄數(shù)可以算出查詢的id的范圍,可以使用 id between and 來查詢:
select * from orders_history where type=2 and id between 1000000 and 1000100 limit 100;查詢時(shí)間:15ms 12ms 9ms
這種查詢方式能夠極大地優(yōu)化查詢速度,基本能夠在幾十毫秒之內(nèi)完成 。限制是只能使用于明確知道id的情況,不過一般建立表的時(shí)候,都會添加基本的id字段,這為分頁查詢帶來很多便利 。
還可以有另外一種寫法:
select * from orders_history where id >= 1000001 limit 100;當(dāng)然還可以使用 in 的方式來進(jìn)行查詢,這種方式經(jīng)常用在多表關(guān)聯(lián)的時(shí)候進(jìn)行查詢,使用其他表查詢的id集合,來進(jìn)行查詢:
select * from orders_history where id in(select order_id from trade_2 where goods = 'pen')limit 100;這種 in 查詢的方式要注意:某些 mysql 版本不支持在 in 子句中使用 limit 。
使用臨時(shí)表優(yōu)化
這種方式已經(jīng)不屬于查詢優(yōu)化,這兒附帶提一下 。
對于使用 id 限定優(yōu)化中的問題,需要 id 是連續(xù)遞增的,但是在一些場景下,比如使用歷史表的時(shí)候,或者出現(xiàn)過數(shù)據(jù)缺失問題時(shí),可以考慮使用臨時(shí)存儲的表來記錄分頁的id,使用分頁的id來進(jìn)行 in 查詢 。這樣能夠極大的提高傳統(tǒng)的分頁查詢速度,尤其是數(shù)據(jù)量上千萬的時(shí)候 。
關(guān)于數(shù)據(jù)表的id說明
一般情況下,在數(shù)據(jù)庫中建立表的時(shí)候,強(qiáng)制為每一張表添加 id 遞增字段,這樣方便查詢 。
如果像是訂單庫等數(shù)據(jù)量非常龐大,一般會進(jìn)行分庫分表 。這個(gè)時(shí)候不建議使用數(shù)據(jù)庫的 id 作為唯一標(biāo)識,而應(yīng)該使用分布式的高并發(fā)唯一 id 生成器來生成,并在數(shù)據(jù)表中使用另外的字段來存儲這個(gè)唯一標(biāo)識 。
使用先使用范圍查詢定位 id (或者索引),然后再使用索引進(jìn)行定位數(shù)據(jù),能夠提高好幾倍查詢速度 。即先 select id,然后再 select *;
以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問題,請您及時(shí)就醫(yī)或請專業(yè)人士給予相關(guān)指導(dǎo)!
「愛刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對您有所幫助:- 35歲后的職業(yè)規(guī)劃 35歲以后職業(yè)生涯規(guī)劃堅(jiān)持兩大原則,輕松實(shí)現(xiàn)自我超越
- php用遞歸求n的階乘 php中n階乘的實(shí)現(xiàn)方法
- php垃圾收集機(jī)制怎么樣的 php引用計(jì)數(shù)如何實(shí)現(xiàn)垃圾回收
- php斷點(diǎn)調(diào)試 php方法斷點(diǎn)如何實(shí)現(xiàn)
- 好兄弟合作開店18年,600平方米的花藝生活空間實(shí)現(xiàn)夢想
- 上班族的“花園夢”就實(shí)現(xiàn)了:陽臺種1盆木香花
- php 上傳文件 php實(shí)現(xiàn)文件的上傳和下載
- mysql可視化管理工具 java連接mysql的jar包沒有bin
- 安裝laravel框架的命令 php laravel框架自帶命令的實(shí)現(xiàn)
- 社會越趨于穩(wěn)定,實(shí)現(xiàn)階層跳躍就越困難,我們何以為生?
