Mysql優化

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

2、三範式:數據庫

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

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

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

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

一、最大鏈接數變量max_connections:
通常設置爲max_connections=1000。
能夠查看此變量的命令: show variables like '%max_connections%' ;設計

二、查詢緩存變量query_cache_size:
通常設置爲query_cache_size=100M;
能夠查看此變量的命令: show variables like '%query_cache_size%' ;3d

三、臨時表大小 tmp_table_size:
通常設置爲 tmp_table_size=100M;
能夠查看此變量的命令: show variables like '%tmp_table_size%' ;code

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

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

.....

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

一、「查詢」一張表的索引。

(1)、desc 表名。

(2)、show indexes from 表名。

(3)、show keys from 表名。
二、「建立索引」

(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)

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

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

select * from emp where empno=1;

select * from emp where email='zhangsan@test.com';

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

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

(3)、更新很是頻繁的字段不適合建立索引。

如 select * from emp where logincount=1;

(4)、不做爲where 條件的字段不應建立索引。

四、對於聯合索引(即多個列建立一個索引),只有查詢條件使用了最左邊的列,索引通常纔會起做用。

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優化

五、對於索引字段,使用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優化
8、優化慢查詢語句:

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

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

(2)、設置 set long_query_time=3;

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

相關文章
相關標籤/搜索