一、优化思路:
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
(2)、不使用最左边的列
explain select from dept where loc='aaa' \G
5、对于索引字段,使用like查询时要注意,如果 like 'aaa%'索引起作用,like '%aaa'索引不起作用。
alter table dept add index my_dname(dname);
(1)、explain select * from dept where dname like 'aaa%' \G
(2)、explain select * from dept where dname like '%aaa' \G
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
(2)、慢sql对比图:
empno字段无索引时:
empno字段创建索引后: