Mysql中查询速度的优化
2019獨角獸企業(yè)重金招聘Python工程師標準>>>
mysql中查詢速度的優(yōu)化
?
1.查看每一個表的數(shù)據(jù)量
2.left join的時候盡量減少表的大小,通過臨時表,查詢條件去限制
3.將固定的條件盡量和傳參的條件分開
4.使用參數(shù)綁定去生成sql,不要直接用值去直接生成sql,這樣可以直接從緩存中獲取sql;
5.用in代替or,這是一條簡單簡易的規(guī)則
Select
From table
Where loc_id=10
Or loc_id=20
or loc_od=30
=>select
from location
where loc_id
in (10,20,30)
?
6.解析優(yōu)化執(zhí)行
7.盡量為where中被引用的列建立索引
如果用<.,<=,=,>,>=和between ,此時索引將被用到,如果在where中對某些列使用函數(shù),則將不會使用該列的索引.
8.使用explain對認為查詢慢的語句sql進行查看
9沒有條件和索引時,不要亂用臨時表,在創(chuàng)建臨時表市也會有性能上的消耗
?
Sql優(yōu)化的實質(zhì):
結果正確的前提下,使用優(yōu)化器可以識別的語句,充分利用索引,減少表掃描的次數(shù),盡量避免搜索的發(fā)生;
?
轉(zhuǎn)載自:http://m.blog.csdn.net/article/details?id=72900541
MySQL大數(shù)據(jù)使用limlit , 查詢效率變低
1. ? 直接用limit?start,?count分頁語句:
select?*?from?product?limit?start,?count
當起始頁較小時,查詢沒有性能問題,我們分別看下從10,?100,?1000,?10000開始分頁的執(zhí)行時間(每頁取20條),?如下:
select?*?from?product?limit?10,?20?? 0.016秒
select?*?from?product?limit?100,?20?? 0.016秒
select?*?from?product?limit?1000,?20?? 0.047秒
select?*?from?product?limit?10000,?20?? 0.094秒
我們已經(jīng)看出隨著起始記錄的增加,時間也隨著增大,?這說明分頁語句limit跟起始頁碼是有很大關系的,那么我們把起始記錄改為40w看下(也就是記錄的一般左右) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?select?*?from?product?limit?400000,?20?? 3.229秒
再看我們?nèi)∽詈笠豁撚涗浀臅r間
select?*?from?product?limit?866613,?20?? 37.44秒
難怪搜索引擎抓取我們頁面的時候經(jīng)常會報超時,像這種分頁最大的頁碼頁顯然這種時
間是無法忍受的。
從中我們也能總結出兩件事情:
1)limit語句的查詢時間與起始記錄的位置成正比
2)MySQL的limit語句是很方便,但是對記錄很多的表并不適合直接使用。
2. ? 對limit分頁問題的性能優(yōu)化方法
利用表的覆蓋索引來加速分頁查詢
我們都知道,利用了索引查詢的語句中如果只包含了那個索引列(覆蓋索引),那么這種情況會查詢很快。
因為利用索引查找有優(yōu)化算法,且數(shù)據(jù)就在查詢索引上面,不用再去找相關的數(shù)據(jù)地址了,這樣節(jié)省了很多時間。另外Mysql中也有相關的索引緩存,在并發(fā)高的時候利用緩存就效果更好了。
在我們的例子中,我們知道id字段是主鍵,自然就包含了默認的主鍵索引。現(xiàn)在讓我們看看利用覆蓋索引的查詢效果如何:
這次我們之間查詢最后一頁的數(shù)據(jù)(利用覆蓋索引,只包含id列),如下:
select?id?from?product?limit?866613,?20 0.2秒
相對于查詢了所有列的37.44秒,提升了大概100多倍的速度
那么如果我們也要查詢所有列,有兩種方法,一種是id>=的形式,另一種就是利用join,看下實際情況:
SELECT?*?FROM?product?WHERE?ID?>?=(select?id?from?product?limit?866613,?1)?limit?20
查詢時間為0.2秒,簡直是一個質(zhì)的飛躍啊,哈哈
另一種寫法
SELECT?*?FROM?product?a?JOIN?(select?id?from?product?limit?866613,?20)?b?ON?a.ID?=?b.id
查詢時間也很短,贊!
其實兩者用的都是一個原理嘛,所以效果也差不多
?
?
?
?
重寫語句min()
Select min(actor_id) from salila.actor where first_name=”xxx”
全表掃描show status
重寫如下
Select actor_id from actor use index(primary) where first_name=”penloper” limit 1
優(yōu)化count()語句
Show status查看需要掃描的行數(shù)據(jù)
Eg:select count(*) from world.City where id>5
Select (select count(*) from world.City)-count(*) from world.City where id<=5;
?
?
在同一個查詢中統(tǒng)計同一列的不同值的數(shù)量,減少查詢語句
Select sum(if(color-‘blue’,1,0)) as blue ,sum(if(colort=’red’,1,0)) as red from items
295
?
?
總結
1查詢中指定dueDate的上限和下限,返回更少的數(shù)據(jù)
2group by ,order by 中不要使用函數(shù),盡量使用能夠有代表性的字段分組(比如說id,就能代替name等)
3條件索引字段上不要使用函數(shù),那樣就走不了索引
4exists 代替 in
5添加有效較小rows的索引
?
?
?
轉(zhuǎn)載于:https://my.oschina.net/iioschina/blog/915290
總結
以上是生活随笔為你收集整理的Mysql中查询速度的优化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ExtJS学习笔记3:载入、提交和验证表
- 下一篇: 我被面试官问到的问题-5