MySQL存储优化和数据库结构优化
“前面说了索引优化,现在我们来说一说存储优化和数据库结构优化 ”
数据库优化除了从索引方面入手,还可以从存储引擎和结构方面入手优化,当然还有硬件优化,服务器性能瓶颈,直接决定MySQL数据库的运行速度和效率,但是在这里我们就不介绍硬件优化了,主要说一说存储优化和数据库结构优化吧
01
—
MySQL存储优化
先介绍介绍存储引擎
Show engines可以查看所有的存储引擎
innodb:
支持事务
行锁,锁定粒度小,并发性能高,有可能出现死锁,所有写操作不会锁定全表,在并发高时,使用InnoDB会提升效率。即存在大量update、insert操作时,效率高
MyISAM:
不支持事务
表锁,锁定粒度大,并发性能低,避免出现死锁
对于使用索引的表,插入记录时MySQL会对插入的记录建立索引,如果大量数据插入建立索引会降低速度。可以在插入数据之前禁用索引,输入插入完成后再开启索引
Alter table table_name DISABLE KEYS
Alter table table_name enable keys
静止唯一性的检测:
插入数据之前执行禁止对外键的检查,数据插入完成后再恢复,可以提供插入效率
SET foreign_key_checks = 0;
SET foreign_key_checks = 1;
静止自动提交:
插入数据之前执行静止事务的自动提交,数据插入完成后再恢复,可以提高查询效率
禁用:SET autocommit = 0;
开启:set autocommit = 1;
02
—
数据库结构优化
在设计表的时候,我们也可以对表进行一些优化,总结了以下几点
优化表结构:
1.尽量将表结构定义为Not Null约束,这时由于在MySQL中含有空值列很难进行查询优化,Null值会使用索引以及索引的统计信息变得复杂
2.对只包含特点类型的字段,可以使用enum,set数据类型
3.数值类型字段的比较比字符串比较效率高很多,字段类型尽量使用最小,最简单的数据类型
4.尽量使用TinyInt(4)、SMALLINT(6)、MEDIUM_INT(8)作为整型 而不是使用int
5.Varchar的长度只分配真正需要的空间
6.尽量使用TIMESTAMP而非DateTime,TIMESTAMP只能表示1970-2038,比DATETIME表示的范围小得多
7.表单不要有太多字段,建议20以内
8.合理加入冗余字段可以提高查询速度
表拆分优化:
表拆分分为两种方式
垂直拆分:
水平拆分:
拆数据,比如对ID进行取余,id%2=0分一张表,不等于0放另一张表
读写分离优化:
数据库基本上是读多写少的,数据库读取的压力会比较大,可以采用主从结构的设计。其中一个是主库负责写入,其他都是从库负责数据的读取
mysql自带主从复制功能,可以使用主从复制的主库作为写库,从库和主库进行数据同步
03
—
优化总结
1.执行计划调优
熟读执行计划,十大参数
2.语句调优
尽量全值匹配
范围条件放最后
Null/Not 有影响
3.索引调优
遵循最左前缀法则
不在索引列上做任何操作
覆盖索引尽量用
不等于要甚用
Like查询要当心
字符类型加引号
OR改UNION效率高
4.设计调优
数据量大,可以分库分表
并行执行多条sql,比如查询多个表的数据总条数,可以优化成并行执行
主从同步,读写分离
5.业务调优
调整业务 比如分页,以前可以指定页数区查询,可以改成下拉形式
返回大数据量,应该考虑需求是否合理