mysql建表 索引以及SQL效能優化

2021-06-26 23:01:38 字數 3843 閱讀 8705

1前言2

設計部分

2.1設計表注意事項

2.1.1

定義字段型別

盡可能精確地定義字段型別,包括型別和長度:如不要以字元型別宣告純數字字段,業務上tinyint夠用的情況避免定義為int等。

2.1.2

盡可能使用not  null

null需要更多的**,更多的檢查和特殊的索引邏輯。所以大多數時候應該使用not  null,或者使用乙個特殊的值,如0,-1作為預設值。

2.1.3

關於char 和varchar的選擇

char型別定長,varchar型別變長。列長度不定,對空間要求高的情況下多使用varchar;列定長,對查詢效能高的情況下多用char。

2.1.4

主鍵與外來鍵

盡可能使用長度短的主鍵,在主鍵上無需建單獨的索引。

外來鍵會影響插入和更新效能,對於批量可靠資料的插入,建議先遮蔽外來鍵檢查。 對於資料量大的表,建議去掉外來鍵,改由應用程式進行資料完整性檢查。

2.2設計索引注意事項

2.2.1

不同表之間的相同屬性值的字段需一致:

不同表之間的相同屬性值的字段,列型別,型別長度,是否非空,是否預設值,需保持一致,否則無法正確使用索引進行關聯對比。

2.2.2

適合建索引的情況:

1、在經常需要搜尋的列上,可以加快搜尋的速度 。

2、在經常用在連線的列上,可以加快連線的速度 。

3、在經常需要根據範圍進行搜尋的列上建立索引,因為索引已經排序,其指定的範圍是連續的 。

4、在經常需要排序的列上建立索引,因為索引已經排序,這樣查詢可以利用索引的排序,加快排序查詢時間 。

5、在經常使用在where子句中的列上面建立索引,加快條件的判斷速度。

2.2.3

不適合建索引的情況:

1、雜湊度很低的列,如性別。

2、有大量空值的列。

3、很少使用的列(很少作為條件或表連線條件的)。

4、頻繁更新的列。

5、在一張表上不要建超過6個索引。

3開發部分

3.1不正確的使用索引列,可能會導致不使用索引,進行全表掃瞄

3.1.1

對索引列進行計算

不建議的寫法:

select col1,col2 from test where index_col/100 > 10;

應寫為:

select col1,col2 from test where index_col > 10*100;

3.1.2

對索引列進行拼接

不建議的寫法:

select col1,col2 from test where concat(first_name,』 』,last_name = 『zhan san』;

應寫為:

select col1,col2 from test where first_name = 『zhan』 and last_name = 『san』;

3.1.3

在索引列上使用is null或is not null

不建議的寫法:

select col1,col2 from test where price is not null;

邏輯上允許的情況下應寫為類似如下的sql:

select col1,col2 from test where price >=0;

3.1.4

在索引列上使用or

不建議的寫法:

select col1,col2 from test where first_name = 『zhan』 or last_name = 『san』;

應寫為:

select col1,col2 from test where first_name = 『zhan』 union select col1,col2 from test where last_name = 『san』;

3.1.5

對索引列進行型別轉換,或隱式的型別轉換

不建議的寫法:

如定義col1為char型

select col1,col2 from test where col1 = 3;

應寫為:

select col1,col2 from test where col1 = 『3』;

3.1.6

盡可能避免索引列在like的首字元使用萬用字元

不建議的寫法:

select col1,col2 from test where first_name like 『%ha%』;

邏輯上允許的情況下應寫為類似如下的sql:

select col1,col2 from test where first_name like 『zha%』;

3.1.7

如果索引是復合索引,那麼必須使用到該索引中的第乙個字段作為條件時才能保證系統使用該索引

create index com_index on test (col1,col2,col3);

相當於建立了index(col1,col2,col3)、index(col1,col2)、index(col1) 3個索引。在查詢時單獨使用col2或col3是不會使用到該索引,必須使用col1才會使用到該索引。

3.2一條sql語句只能使用乙個表的乙個索引

在where條件中多個and的條件中,必須都是乙個多列索引的key_part屬性而且必須包含key_part1。各自單一索引的話,只使用遍歷最少行的那個索引。

3.3只查詢需要的列,避免使用select *

select * from test;

應寫為:

select col1,col2,col3 from test;

3.4使用[not] exists 代替 [not] in

select col1,col2 from test where col1 in (select col3 from t2);

應寫為:

select col1,col2 from test where exists (select 1 from t2 where test.col1 = t2.col3);

3.5邏輯上能用union all的時候不要用union

union會對結果進行排序去重,union all則不會。如果已經確定資料不會包括重複行,或者你不在乎是否會出現重複的行時使用union all。

select col1,col2 from test where col1 >=10 union select col1,col2 from test where col2 >=10;

邏輯上允許的情況下應寫為:

select col1,col2 from test where col1 >=10 union all select col1,col2 from test where col2 >=10;

3.6沒有必要時不要使用distinct 和order by

使用distinct 或order by會對結果集進行排序,在結果集較大的情況下會占用大量資源。

3.7使用case when來避免多次掃瞄表

select sum(col1) from test where col2 = 1;

select sum(col1) from test where col2 = 2;

應寫為:

select sum(case when col2 = 1 then col1 else 0 end) as sum1, sum(case when col2 = 2 then col1 else 0 end) as sum2 from test;

3.8大資料全表清空時使用truncate代替delete

delete from test;

應寫為:

truncate table test;

3.9查詢少量記錄時使用limit

記錄下mysql索引以及回表

mysql資料庫的innodb引擎所有的表都預設建立在索引之上的,也就是聚集索引,而主鍵就是聚集索引,所以主鍵只能建乙個。普通索引也就是非聚集索引,可以多個。索引的資料結構是b 樹也就是平衡樹。查詢資料的時候根據索引查詢資料所在位置然後取到資料。查詢普通索引的時候是先根據普通索引找到主鍵再根據主鍵定...

Mysql之如何建立索引以及組合索引

資料庫中為何要建立索引?這個問題對於做做簡單實驗的學生來說似乎並不需要過於了解,但是,如果處理的資料達到百萬以及以上的時候,合適的索引就能夠體現出很強大的優勢 mysql預設使用b 樹索引 建立索引的三種方式 三種方式 1.create index index name on table name ...

mysql索引以及慢SQL優化記錄 轉慕課

mysql索引介紹以及慢sql優化 索引介紹 略 sql優化說明 慢sql優化例子select count from task where status 2 and operator id 20839 and operate time 1371169729 and operate time 1371...