SQL語句優化 一 (52)

2021-09-26 20:12:22 字數 4509 閱讀 9201

格式:mysql> show [session|global]status;

其中:session(預設)表示當前連線,

global表示自資料庫啟動至今

mysql>show status;

mysql>show global status;

mysql>show status like 『com_%』;

mysql>show global status like 『com_%』;

引數說明:

com_***表示每個***語句執行的次數如:

com_select 執行select操作的次數,一次查詢只累計加1

com_update 執行update操作的次數

com_insert 執行insert操作的次數,對批量插入只算一次。

com_delete 執行delete操作的次數

只針對於innodb儲存引擎的。

innodb_rows_read 執行select操作的次數

innodb_rows_updated 執行update操作的次數

innodb_rows_inserted 執行insert操作的次數

innodb_rows_deleted 執行delete操作的次數

其他:connections 連線mysql的數量

uptime 伺服器已經工作的秒數

slow_queries:慢查詢的次數

1)explain select * from table  where id=1000;

2)desc select * from table where id=1000;

mysql> explain select count(*) from stu where name like "a%"\g

*************************** 1. row ***************************

id: 1

select_type: ******

table: stu

type: range

possible_keys: name,ind_stu_name

key: name

key_len: 50

ref: null

rows: 8

extra: using where; using index

1 row in set (0.00 sec)

每一列的簡單解釋

id: 1

select_type: ****** 表示select的型別,常見的取值有******()簡單表,即不使用表連線或者子查詢)、primary(主查詢,即外層的查詢)、union(union中的第二個或者後面的查詢語句)、subquery(子查詢中的第乙個sesect)等

table: stu   輸出結果集的表

type: range  表示表的連線型別,效能有好到差:system(表僅一行)、const(只一行匹配)、eq_ref(對於前面的每一行使用主鍵和唯一)、ref(同eq_ref,但沒有使用主鍵和唯一)、ref_or_null(同前面對null查詢)、index_merge(索引合併優化)、unique_subquery(主鍵子查詢)、index_subquery(非主鍵子查詢)、range(表單中的範圍查詢)、index(都通過查詢索引來得到資料)、all(通過全表掃瞄得到的資料)

possible_keys: name,ind_stu_name  表查詢時可能使用的索引。

key: name   表示實際使用的索引。

key_len: 50  索引欄位的長度

ref: null 

rows: 8   掃瞄行的數量

extra: using where; using index 執**況的說明和描述

索引是資料庫優化中最常見也是最重要的手段之一,通過索引通常可以幫助使用者解決大多數的sql效能問題。

myisam儲存引擎的表的資料和索引是自動分開儲存的,各自是獨一的乙個檔案;innodb儲存引擎的表的資料和索引是儲存在同乙個表空間裡面,但可以有多個檔案組成。

mysql目前不支援函式索引,但是能對列的前面某一部分進行索引,例如name欄位,可以只取name的前4個字元進行索引,這個特性可以大大縮小索引檔案的大小,使用者在設計表結構的時候也可以對文字列根據此特性進行靈活設計。

mysql>create index ind_company2_name on company2(name(4));

其中company表名 ind_company2_name索引名

索引用於快速找出在某個列中有一特定值的行。對相關列使用索引是提高select操作效能的最佳途徑。

(1)對於建立的多列索引,只要查詢的條件中用到最左邊的列,索引一般就會被使用。如下建立乙個復合索引。

mysql>create index ind_sales2_com_mon onsales2(company_id,moneys);

然後按company_id進行查詢,發現使用到了復合索引

mysql>explain select * from sales2 where company_id=2006\g

使用下面的查詢就沒有使用到復合索引。

mysql>explain select * from sales2 where moneys=1\g

(2) 使用like的查詢,後面如果是常量並且只有%號不在第乙個字元,索引才可能會被使用,如下:

mysql> explain select * from company2 where name like "%3"\g

*************************** 1. row ***************************

id: 1

select_type: ******

table: company2

type: all

possible_keys: null

key: null

key_len: null

ref: null

rows: 1000

extra: using where

1 row in set (0.00 sec)

如下這個使用到了索引,而下面例子能夠使用索引,區別就在於「%」的位置不同,上面的例子是吧「%」放在了第一位,而下面的例子則沒有

mysql> explain select * from company2 where name like 「3%"\g

*************************** 1. row ***************************

id: 1

select_type: ******

table: company2

type: range

possible_keys: ind_company2_name

key: ind_company2_name

key_len: 11

ref: null

rows: 103

extra: using where

1 row in set (0.00 sec)

(3)如果對大的文字進行搜尋,使用全文索引而不使用 like「%...%」.

(4)如果列名是索引,使用column_name is null將使用索引。如下

mysql> explain select * from company2 where name is null\g

*************************** 1. row ***************************

id: 1

select_type: ******

table: company2

type: ref

possible_keys: ind_company2_name

key: ind_company2_name

key_len: 11

ref: const

rows: 1

extra: using where

1 row in set (0.00 sec)

(1)如果mysql估計使用索引比全表掃瞄更慢,則不使用索引。例如如果列key_part1均勻分布在1到100之間,查詢時使用索引就不是很好

mysql>select * from table_name where key_part1>1 and key_part<90;

(2)如果使用memory/heap表並且where條件中不使用「=」進行索引列,那麼不會用到索引。heap表只有在「=」的條件下會使用索引。

(3)用or分割開的條件,如果or前的條件中的列有索引,而後面的列中沒有索引,那麼涉及的索引都不會被用到。

mysql>show index from sales\g

*************************** 1. row ***************************       

… …key_name: ind_sales_year

seq_in_index:1

column_name: year

… …

52 條 SQL 語句效能優化策略

本文會提到52條sql語句效能優化策略。1 對查詢進行優化,應盡量避免全表掃瞄,首先應考慮在where及order by涉及的列上建立索引。2 應盡量避免在where子句中對字段進行null值判斷,建立表時null是預設值,但大多數時候應該使用not null,或者使用乙個特殊的值,如0,1作為預設...

sql語句優化 一

1.檢視執行時間和cpu占用時間 set statistics time on select from dbo.product set statistics time off2.檢視查詢對i 0的操作情況 set statistics io on select from dbo.product se...

SQL 語句優化 OR 語句優化案例

從上海來到溫州,看了前幾天監控的sql語句和資料變化,發現有一條語句的io次數很大,達到了150萬次io,而兩個表的資料也就不到20萬,為何有如此多的io次數,下面是執行語句 select ws.nodeid,wi.laststepid,wi.curstepid from workflowinfo ...