1、explain:解釋sql的執(zhí)行計(jì)劃,后邊的sql不執(zhí)行
目前成都創(chuàng)新互聯(lián)已為近1000家的企業(yè)提供了網(wǎng)站建設(shè)、域名、雅安服務(wù)器托管、網(wǎng)站運(yùn)營、企業(yè)網(wǎng)站設(shè)計(jì)、瑞麗網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
2、explain partitions :用于查看存在分區(qū)的表的執(zhí)行計(jì)劃
3、explain extended:待驗(yàn)證
4、show warnings:
5、show create table:查看表的詳細(xì)的創(chuàng)建語句,便于用戶對表進(jìn)行優(yōu)化
6、show indexes :產(chǎn)看表的所有索引,show indexes from table_name,同樣也可以從information_schema.statistics表中獲得同樣的信息。cardinality列很重要,表示數(shù)據(jù)量。
7、show tables status: 查看數(shù)據(jù)庫表的底層大小以及表結(jié)構(gòu),同樣可以從information_schema.tables表中獲得底層表的信息。
8、show [global|session]status:可以查看mysql服務(wù)器當(dāng)前內(nèi)部狀態(tài)信息??梢詭椭鷧s行mysql服務(wù)器的負(fù)載的各種指標(biāo)。默認(rèn)是session。同information_schema.global_status和information_schema.session_status
9、show [global|session] variables :查看當(dāng)前mysql系統(tǒng)變量的值,其中一些值能影響到sql語句的執(zhí)行方式。同information_schema.global_variables和information_schema.session_variables;
10、information_schema:包含的表的數(shù)量和mysql的版本有關(guān)系。
mysql優(yōu)化無索引查詢:SQL CREATE TABLE test_tab (id INT,name VARCHAR(10),age INT,val VARCHAR(10)。
1、對查詢進(jìn)行優(yōu)化,應(yīng)盡量避免全表掃描,首先應(yīng)考慮在where及order by涉及的列上建立索引。
2、應(yīng)盡量避免在 where子句中使用!=或操作符,否則將引擎放棄使用索引而進(jìn)行全表掃描。
3、應(yīng)盡量避免在 where子句中對字段進(jìn)行null值判斷,否則將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描。
運(yùn)行mysql安裝文件:
按 Next,然后選擇安裝方式,有 "Typical(默認(rèn))"、"Complete(完全)"、"Custom(用戶自定義)",選擇第二個選項(xiàng) "Custom",下一步, MySQL Server (mysql服務(wù)器), Developer Components (開發(fā)者部分), Debug Symbols (調(diào)試符號), Server data files (服務(wù)器數(shù)據(jù)文件) 默認(rèn)。
改變安裝路徑;原路徑是"C:\Program Files\MySQL\MySQL Server 5.5\",也可以修改為:"E:\Program Files\MySQL Server 5.5\"。
修改mysql配置文件,優(yōu)化緩存大小和連接數(shù)連接方式,優(yōu)化sql語句 ,記得mysql好像是有工具可以查看最占用資源的sql語句,找到他,優(yōu)化他。
安裝好mysql后,配制文件應(yīng)該在/usr/local/mysql/share/mysql目錄中,配制文件有幾個,有my-huge.cnf my-medium.cnf my-large.cnf my-small.cnf,不同的流量的網(wǎng)站和不同配制的服務(wù)器環(huán)境,當(dāng)然需要有不同的配制文件了。
一般的情況下,my-medium.cnf這個配制文件就能滿足我們的大多需要;一般我們會把配置文件拷貝到/etc/my.cnf 只需要修改這個配置文件就可以了,使用mysqladmin variables extended-status _u root _p 可以看到目前的參數(shù),有3個配置參數(shù)是最重要的,即key_buffer_size,query_cache_size,table_cache。
key_buffer_size只對MyISAM表起作用,
key_buffer_size指定索引緩沖區(qū)的大小,它決定索引處理的速度,尤其是索引讀的速度。一般我們設(shè)為16M,實(shí)際上稍微大一點(diǎn)的站點(diǎn) 這個數(shù)字是遠(yuǎn)遠(yuǎn)不夠的,通過檢查狀態(tài)值Key_read_requests和Key_reads,可以知道key_buffer_size設(shè)置是否合理。比例 key_reads / key_read_requests應(yīng)該盡可能的低,至少是1:100,1:1000更好(上述狀態(tài)值可以使用SHOW STATUS LIKE ‘key_read%’獲得)。 或者如果你裝了phpmyadmin 可以通過服務(wù)器運(yùn)行狀態(tài)看到,筆者推薦用phpmyadmin管理mysql,以下的狀態(tài)值都是本人通過phpmyadmin獲得的實(shí)例分析:
這個服務(wù)器已經(jīng)運(yùn)行了20天
key_buffer_size _ 128M
key_read_requests _ 650759289
key_reads - 79112
比例接近1:8000 健康狀況非常好
mysql -u root -p 回車輸入密碼進(jìn)入mysql
show processlist;
查看連接數(shù),可以發(fā)現(xiàn)有很多連接處于sleep狀態(tài),這些其實(shí)是暫時沒有用的,所以可以kill掉
show variables like "max_connections";
查看最大連接數(shù),應(yīng)該是與上面查詢到的連接數(shù)相同,才會出現(xiàn)too many connections的情況
set GLOBAL max_connections=1000;
修改最大連接數(shù),但是這不是一勞永逸的方法,應(yīng)該要讓它自動殺死那些sleep的進(jìn)程。
show global variables like 'wait_timeout';
這個數(shù)值指的是mysql在關(guān)閉一個非交互的連接之前要等待的秒數(shù),默認(rèn)是28800s
set global wait_timeout=300;
修改這個數(shù)值,這里可以隨意,最好控制在幾分鐘內(nèi)
set global interactive_timeout=500;
修改這個數(shù)值,表示mysql在關(guān)閉一個連接之前要等待的秒數(shù),至此可以讓mysql自動關(guān)閉那些沒用的連接,但要注意的是,正在使用的連接到了時間也會被關(guān)閉,因此這個時間值要合適
SHOW VARIABLES LIKE '%table_open_cache%';
查看
show global status like 'Open%tables';
語句執(zhí)行后,會顯示三個字段: Query_ID(執(zhí)行ID) | Duration(持續(xù)時間)| Query(查詢語句) ;
拿到后Query_ID后,可執(zhí)行 show profile for query Query_ID ,查看詳細(xì)的準(zhǔn)備時間,執(zhí)行時間、執(zhí)行結(jié)束( preparing、executing、end )等。
顯示用戶正在運(yùn)行的線程,需要注意的是,除了 root 用戶能看到所有正在運(yùn)行的線程外,其他用戶都只能看到自己正在運(yùn)行的線程,看不到其它用戶正在運(yùn)行的線程。除非單獨(dú)個這個用戶賦予了PROCESS 權(quán)限。
顯示字段包含: User| Host| db | Command | Time| State| Info 等。
解析語句,查詢是否命中索引,及,命中何種索引,用以判斷是否符合我們的預(yù)期。
返回字段包含: select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra 等。
select_type 常見類型:
(1) SIMPLE(簡單SELECT,不使用UNION或子查詢等)
(2) PRIMARY(子查詢中最外層查詢,查詢中若包含任何復(fù)雜的子部分,最外層的select被標(biāo)記為PRIMARY)
(3) UNION(UNION中的第二個或后面的SELECT語句)
(4) SUBQUERY(子查詢中的第一個SELECT,結(jié)果不依賴于外部查詢)
table 常見類型:
顯示這一行的數(shù)據(jù)是關(guān)于哪張表的.
有時不是真實(shí)的表名字,看到的是derivedx(x是個數(shù)字,我的理解是第幾步執(zhí)行的結(jié)果)
type 常見類型:
對表訪問方式,表示MySQL在表中找到所需行的方式,又稱“訪問類型”。
常用的類型有: ALL、index、range、 ref、eq_ref、const、system、NULL (從左到右,性能從差到好)
possible_keys
指出MySQL能使用哪個索引在表中找到記錄,查詢涉及到的字段上若存在索引,則該索引將被列出,但不一定被查詢使用(該查詢可以利用的索引,如果沒有任何索引顯示 null)
該列完全獨(dú)立于EXPLAIN輸出所示的表的次序。這意味著在possible_keys中的某些鍵實(shí)際上不能按生成的表次序使用。
如果該列是NULL,則沒有相關(guān)的索引。在這種情況下,可以通過檢查WHERE子句看是否它引用某些列或適合索引的列來提高你的查詢性能。如果是這樣,創(chuàng)造一個適當(dāng)?shù)乃饕⑶以俅斡肊XPLAIN檢查查詢
key
key列顯示MySQL實(shí)際決定使用的鍵(索引),必然包含在possible_keys中
如果沒有選擇索引,鍵是NULL。要想強(qiáng)制MySQL使用或忽視possible_keys列中的索引,在查詢中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。
key_len
表示索引中使用的字節(jié)數(shù),可通過該列計(jì)算查詢中使用的索引的長度,非實(shí)際長度,為最大可能長度。
注:不損失精確性的情況下,長度越短越好。
ref
列與索引的比較,表示上述表的連接匹配條件,即哪些列或常量被用于查找索引列上的值。
rows
估算出結(jié)果集行數(shù),表示MySQL根據(jù)表統(tǒng)計(jì)信息及索引選用情況,估算的找到所需的記錄所需要讀取的行數(shù);
extra
該列包含MySQL解決查詢的詳細(xì)信息,有以下幾種情況:
(1).Distinct
一旦MYSQL找到了與行相聯(lián)合匹配的行,就不再搜索了
(2).Not exists
MYSQL優(yōu)化了LEFT JOIN,一旦它找到了匹配LEFT JOIN標(biāo)準(zhǔn)的行,就不再搜索了
(3).Range checked for each
Record(index map:#)
沒有找到理想的索引,因此對于從前面表中來的每一個行組合,MYSQL檢查使用哪個索引,并用它來從表中返回行。這是使用索引的最慢的連接之一
(4).Using filesort
看到這個的時候,查詢就需要優(yōu)化了。MYSQL需要進(jìn)行額外的步驟來發(fā)現(xiàn)如何對返回的行排序。它根據(jù)連接類型以及存儲排序鍵值和匹配條件的全部行的行指針來排序全部行;
(5).Using temporary
看到這個的時候,查詢需要優(yōu)化了。這里,MYSQL需要創(chuàng)建一個臨時表來存儲結(jié)果,這通常發(fā)生在對不同的列集進(jìn)行ORDER BY上,而不是GROUP BY上;
(6).Using index
列數(shù)據(jù)是從僅僅使用了索引中的信息而沒有讀取實(shí)際的行動的表返回的,這發(fā)生在對表的全部的請求列都是同一個索引的部分的時候。
(7).Using where
使用了WHERE從句來限制哪些行將與下一張表匹配或者是返回給用戶。如果不想返回表中的全部行,并且連接類型ALL或index,這就會發(fā)生,或者是查詢有問題。
1,sql的編譯順序
sql 編譯順序 from… on… join… where… order by… group by… having… select…
2,查看sql語句性能:
explain 查詢sql語句
3,優(yōu)化
(1). 最佳作前綴,使用索引順序(按編譯順序)與定義索引時順序一致,若該字段有跳過、反序,該字段及后面字段索引失效
(2). where條件中一切不是=的操作大概率會使索引失效,包括in、!=、、is null、計(jì)算、函數(shù)等等
(3). 查詢字段與條件字段不一致時使用子查詢,避免臨時表出現(xiàn)
(4). 若用了復(fù)合索引,盡量使用全部索引字段
(5). 能不查詢多字段時,盡量使用索引覆蓋
(6). 使用like模糊查詢時,按關(guān)鍵字左匹配,即‘x%’,若使用’%x%’,索引失效
(7). or會使全部索引失效
(8). 盡量不要導(dǎo)致類型轉(zhuǎn)換,否則索引失效
(9). 使用order by時,根據(jù)表中數(shù)據(jù)量調(diào)整單路還是雙路查詢,也可以調(diào)整buffer區(qū)大小:如set_max_length_for_sort_data = 1024 (單位byte)
(10). 避免使用select *…
(11). 分頁偏移量大時,盡量使用子查詢 select * from tab where id=(select id from tab limit 100000,1) limit 100;