SQL優化總結

2021-08-20 11:58:26 字數 2829 閱讀 2842

1.首先在建表的時候,選用最合適的字段型別。

例如在定義name欄位時,可以使用varchar(32),不要使用char(32),以減少不必要的空間;而在定義郵編(郵編固定6位)時也沒必要使用varchar(6)了,直接使用char(6)會更好;對於性別,省份等可以定義為enum型別,因為數值型的資料檢索速度比文字型別要快;只含數值資訊的字段盡量不要設計為字元型。

2.在建表時一些必填的字段設定為not null,這樣在以後查詢的時候,減少了對null的判斷,提高了檢索速度。

3.使用外來鍵保證資料的合法性。

如果要在mysql中使用外來鍵,一定要記住在建立表的時候將表的型別定義為事務安全表innodb型別。該型別不是mysql表的預設型別。定義的方法是在createtable語句中加上engine=innodb,簡單示例:

drop table if exists person;

create table person (

id int(11) not null auto_increment,

name varchar(32) not null,

age int(3) default 0,

primary key (id),

) engine=innodb default charset=utf8;

drop table if exists address;

create table address (

id int(11) not null auto_increment,

person_id int(11) not null,

address_name varchar(255) not null,

primary key (id),

constraint pk_ap foreign key (person_id) references person (id) on delete cascade

) engine=innodb default charset=utf8;

4.建立索引

一般說來,索引應建立在那些將用於join,where判斷和order by排序的字段上。盡量不要對資料庫中某個含有大量重複的值的字段建立索引,索引不是越多越好的。

5.絕大多數情況下,使用索引可以提高查詢的速度,但如果sql語句使用不恰當的話,索引將無法發揮它應有的作用。

(1)應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃瞄(任何在where子句中使用is null或is not null的語句優化器是不允許使用索引的 ),可以在字段上設定預設值,如上述建表中的age欄位,在查詢的時候就可以使用

select * from person where age = 0;

而不是select * from person where age is null;

(2)應盡量避免在 where 子句中使用 != 或 <> 操作符,否則將引擎放棄使用索引而進行全表掃瞄。

select * from person where age<>0;

可替換為

select * from person where age>0;

(3)應盡量避免在 where 子句中使用 or 來連線條件,如果乙個欄位有索引,乙個字段沒有索引,將導致引擎放棄使用索引而進行全表掃瞄,盡量使用union(去除重複,如果不想去除重複,則可使用union all)代替or。

select * from person where age=0 or name='李四';

可替換為

select * from person where age=0

union

select * from person where name='李四';

(4)應盡量避免在 where子句中對字段進行表示式操作,這將導致引擎放棄使用索引而進行全表掃瞄

select id from t where num/2 = 100 ;

替換為select id from t where num = 100*2;

6.使用連線json代替子查詢

select p.name,p.age

from person p

where p.id not in (select a.person_id from address a);

可替換為

select p.name,p.age

from person p left join address a on p.id = a.person_id

where a.person_id is null;

7.盡量少的使用in 和not in ,使用exists代替,上例中還可以使用如下**代替

select p.name,p.age

from person p

where not exists (select 1 from address a where a.person_id = p.id);

8.update語句中更改幾個欄位寫幾個字段,不要update全部字段。

9.使用count函式不要count(*),可以寫成count(0)。

select count(*) from person;

替換為select count(0) from person;

10.盡量用具體的字段代替select *。

11.where條件查詢的連線順序:表之間的連線必須寫在其他where條件之前, 那些可以過濾掉最大數量記錄的條件必須寫在where子句的末尾。

SQL優化總結

1,子查詢優化後問題 有些欄位的區分度飄忽飄忽不定,比如status欄位。我們這個欄位在專案中使用了索引。老版本優化時把主鍵id查出來放到子查詢中,再用status進行篩選,這樣有效果。公升級了mysql之後,出現慢查詢。這個時候子查詢不再適用,應使用ignore index status idx ...

SQL優化總結1

oracle 優化手段 指執行sql時繫結變數,減少軟解析時間。result cache 將某更新不頻繁的表的結果中存在快取中,下次直接讀快取,如果改表有更新,快取自動失效 表聯合查詢時,9i前大表 結果集 小表 結果集 的位置 block塊的大小的設定,設定小,則io頻繁,cup低耗,反之反之 索...

sql 語句優化總結

我們如何更迅速的從乙個大型專案中,知道是什麼影響了服務的效能。mysql 提供了一些常用的命令來查詢資料庫的執行狀態。1.show status like uptime 檢視mysql資料庫執行了多長時間 2.show status like com select 檢視mysql 資料庫的查詢次數 ...