Mysql優化

一、優化思路:
1、設計3NF即表設計要滿足三範式。
2、優化配置文件參數(my.ini|my.cnf)。
3、使用存儲過程、視圖、觸發器,結合定時任務。
4、分隔表:水平分隔、垂直分隔。
5、讀寫分離。
6、增量備份:對無用的歷史數據進行定期備份。
7、sql語句優化:從慢查詢來解決sql語句的優化,如建立索引。
8、硬件。

二、三範式:

1、第一範式:列的原子性,也就是不可拆分

2、第二範式:必須有主鍵,記錄唯一。

3、第三範式:不存在冗餘字段。【注意注意:適當的冗餘也是允許的。】

三、優化配置文件【my.ini或者my.cnf】:

1、最大連接數變量max_connections:
一般設置爲max_connections=1000。
可以查看此變量的命令: show variables like '%max_connections%' ;

2、查詢緩存變量query_cache_size:
一般設置爲query_cache_size=100M;
可以查看此變量的命令: show variables like '%query_cache_size%' ;

3、臨時表大小 tmp_table_size:
一般設置爲 tmp_table_size=100M;
可以查看此變量的命令: show variables like '%tmp_table_size%' ;

4、索引緩衝區的大小 key_buffer_size:
一般設置爲物理內存的1/4(針對MyISAM引擎), 如key_buffer_size=100M;
可以查看此變量的命令: show variables like '%key_buffer_size%' ;

5、排序緩存區的大小 sort_buffer_size:
默認大小是256kb,過大的配置會消耗更多的內存,一般設置爲 sort_buffer_size=10M;
可以查看此變量的命令: show variables like '%sort_buffer_size%' ;

.....

四、索引:
對於提高數據庫性能,索引是個物美價廉的方式。不用加內存,不用改程序,不用調sql,只需要正確建立索引,就可以把查詢速度提高百倍千倍。不過天下沒有免費的午餐,建立索引提高了查詢速度,但降低了增、刪、改的速度。
索引的精髓是:sql查詢無索引時會掃描全表,所以查詢速度慢;有索引時掃描部分表,所以查詢速度快。

1、“查詢”一張表的索引。

(1)、desc 表名。

(2)、show indexes from 表名。

(3)、show keys from 表名。
2、“創建索引”

(1)、創建表時:
create table test (id int primary key, email varchar(30) unique, name varchar(30) key)或者
create table test (id int, email varchar(30) unique, name varchar(30) key, primary key(id),unique(email),key(name))

(2)、創建表後
alter table test add primary key (id),unique(email),key(name)

3、哪些列適合建索引?哪些列不適合建索引?

(1)、查詢條件比較頻繁的字段應該創建索引。

select * from emp where empno=1;

select * from emp where email='[email protected]';

(2)、唯一性太差的字段雖然頻繁作爲查詢條件但不適合創建索引。

如select * from emp where sex='男';

(3)、更新非常頻繁的字段不適合創建索引。

 如 select * from emp where logincount=1;

(4)、不作爲where 條件的字段不該創建索引。

4、對於聯合索引(即多個列創建一個索引),只有查詢條件使用了最左邊的列,索引一般纔會起作用。

alter table dept add index my_index(dname,loc);
(1)、使用最左邊的列
explain select from dept where dname='aaa' \G
Mysql優化
(2)、不使用最左邊的列
explain select
from dept where loc='aaa' \G
Mysql優化

5、對於索引字段,使用like查詢時要注意,如果 like 'aaa%'索引起作用,like '%aaa'索引不起作用。

alter table dept add index my_dname(dname);

(1)、explain select * from dept where dname like 'aaa%' \G
Mysql優化

(2)、explain select * from dept where dname like '%aaa' \G

Mysql優化
八、優化慢查詢語句:

1、設置慢查詢的時間long_query_time:

(1)、顯示show variables like 'long_query_time',默認爲10s;

(2)、設置 set long_query_time=3;

2、使用explain命令分析sql語句:
(1)explain select * from dept where loc='aaa' \G
Mysql優化
(2)、慢sql對比圖:
empno字段無索引時:
Mysql優化
empno字段創建索引後:
Mysql優化

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章