當需要統計結果的行數時,盡量用count(*),而不是使用count(某一列)。當存在where條件時,需要先掃瞄條件中指定的資料,如果子條件中的資料過多,在統計行數時,可以使用相反的where條件,再用總數減去相反條件下的行數即可。
如果要使用limit 1000, 20, 需要查詢1020條記錄,最後只返回後20條記錄,前面查詢到的1000條記錄要被拋棄。
例如,要查詢電影表中索引為1000到1009的資料,一般會這樣寫:
select id, title, description from film limit 1000, 10
但是,查詢多列資料效率太低,可以先只查詢id,再和自己關聯就可以得到其他列的資料。優化後的語句如下:
select film.id, film.title, film.description
from film
inner
join
(select id from film limit 1000, 10
) as lim
using(id)#兩個表中有相同的欄位名,可以用using,當然也可以用on。
如果某列位置上有索引,可以直接根據該索引進行分頁。
如:
select film.id, film.title, film.description
from film
where position between 1000
and1009
order
by position
union 用於合併兩個或多個 select 語句的結果集,並消去表中任何重複行。
union 內部的 select 語句必須擁有相同數量的列,列也必須擁有相似的資料型別。
除非真的需要消除重複行,否則一定要使用union all。如果沒有all關鍵字,mysql會給臨時表新增distinct操作,對臨時表做唯一性檢查。事實上,mysql問題把查詢結果先放在臨時表中,再返回給客戶端。
使用者自定義變數可以表示具體的值,也可以是的單個的select結果(select min()…),但不能是資料集合。定義方式如下:
set @num := 0
#可以使用=賦值,為避免歧義,用:=賦值。
select id, @num=@num+1 from film
#假設id是從1開始的,結果如下:11
2233
...
注意有一些限定條件,如:自定義變數無法查詢快取,只在乙個鏈結中有效等。
另外,在where或者order by 中慎用使用者自定義變數, 因為where和select是出現在查詢的不同階段。
如:
set @num :=0
select id, @num:=@num+1
from film
where @num
<=1
上面的語句,返回的結果是兩行,而不是一行。可以這樣修改:
set @num :=0
select id, @num
from film
where (@num := @num+1)<=1
使用者自定義變數的用法較多,可以和greatest()和least()函式結合。
greatest(欄位1, 欄位2…)可以返回每一行資料中,多個欄位中的最大值,select greatest()的結果為一列。
least()的用法是類似的,返回的是每一行中的最小值。
mysql的效能優化 mysql效能優化
檢視安裝指令碼 select version 非互動式超時時間,如jdbc show global variables like wait timeout 互動式超時時間,如資料庫工具 show global variables like interactive timeout show sessi...
mysql效能優化 mysql效能優化
優化方式 1.空間換時間 冗餘 2.時間換空間 字段優先使用型別 int date char varchar text 索引型別 btree索引 hash索引 索引的葉子下,存放乙個資訊指向所在行的資料位址。btree有利於範圍查詢,hash有利於精確查詢。btree用的更多一些。btree索引的常...
Mysql 效能優化及問題
檢視 max allowed packet show variables like max allowed packet 以下內容為 mysql根據配置檔案會限制server接受的資料報大小。有時候大的插入和更新會被max allowed packet 引數限制掉,導致失敗。檢視目前配置 varia...