mysql优化
Posted yoxuc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql优化相关的知识,希望对你有一定的参考价值。
数据库命名规范:
1.所以数据库对象名称统一以小写字母开头并以下划线分割(数据区分大小写)
2.禁止使用mysql关键字命名对象
3.对象名称须做到见名识义并且不要超过32个字符
4.临时表须以tmp_为前缀,时间戳为后缀
5.备份库,备份表以bak_为前缀,时间戳为后缀
6.所有存储相同列名必须和列类型一致
数据库基本设计规范:
1.所有表必须使用InnoDB存储引擎(支持行级锁,支持事物,mysql5.6版本之后为默认引擎,高并发性能好,更好的恢复性)
2.数据库和表的字符集统一使用UTF-8(兼容性更好,GBK支持中文)
3.mysql中UTF-8中文占用3个字节,ASC码占用一个字节
4.所有表和字段须添加注释(使用comment从句)
5.从一开始就要进行数据字典的维护
6.尽量控制单表的数据量大小,500万行以内为最佳
7.谨慎使用mysql分区表(分区表在物理上为多个文件,在逻辑上为一个表,跨分区查询数据效率更差,建议采用物理分表的方式拆分大表)
8.尽量做到冷热数据分离,减小表的宽度(减少磁盘IO,保证热数据命中率)
9.禁止在表中建立预留字段
10.禁止在数据库中存储图片,文件等二进制数据
11.禁止在线上数据库进行压力测试
12.数据库各个环境进行隔离(否则会破坏生产环境数据完整性)
数据库索引设计规范:
1.单张表的索引数量不要超过5个(索引可以提高查询效率也可以降低效率)
2.禁止给表中每一列都建立索引
3.SELECT,UPDATE,DELETE,语句中WHERE从句的列以及包含在ORDER BY,GROUP BY,DESTINCT中的列建立索引。
4.JOIN关联列建立索引
5.建立联合索引时选择区分度最高,字段长度小的列,使用最频繁的列的放在左侧(联合索引从左到右查询)
6.避免建立重复索引(同一列建立多个索引)和冗余索引(部分索引列重复)
7.对于频繁的查询优先考虑覆盖索引
8.尽量避免使用外键约束
数据库字段设计规范:
1.优先选择符合存储需要最小的数据类型(尽量将字符串转化为数字存储)
2.对非负数据选择无符号整形类型存储
3.varchar(N)中N代表的是字符数,不是字节数
4.使用UTF8存储一个汉字占用3个字节
5.过大的长度会消耗更大的内存
6.避免使用TEXT,BLOB等数据类型,如有需要按垂直分表分成扩展表操作
7.避免使用ENUM类型(ENUM类型使用ORDER BY 排序事效率较差,不会使用索引)
8.尽量把所有列定义时使用NOT NULL属性(索引NULL列需要占用额外的空间保存,进行比较和计算时要另外计算)
9.不要使用字符串存储日期型数据(使用TIMESTAMP或datetime)
10.财务类数据使用decimal类型存储(不丢失精度)
SQL开发规范:
1.数据库操作使用预编译语句(避免SQL注入和可以重复的使用执行计划)
2.避免数据类型的隐式转换(隐士转换会导致索引失效)
3.充分利用表上已经存在的索引
4.使用LEFT JOIN或NOT EXISTS来优化NOT in操作(NOT IN会导致索引失效)
5.程序连接不同数据库使用不同账号,禁止跨库查询(降低业务耦合度,和避免后期转库带来的麻烦)
6.禁止使用SELECT * 进行查询(使用SELECT 字段名。。。无法使用覆盖索引,可减少表结构修改时带来的影响)
7.禁止使用不含字段名的INSERT语句(可减少表结构修改时带来的影响)
8.避免使用子查询(尽量优化城JOIN语句,子查询的结果集无法使用索引,会产生大量的临时表造成慢查询)
9.避免使用JOIN关联过多的表(建议不超过5个,MYSQL最多允许关联61个)
10.尽量减少同数据库的交互次数(读操作尽量合并成一条)
11.使用IN代替OR操作
12.禁止使用ORDER BY RAND()进行随机排序(如有需要在业务端处理)
13.WHERE从句中禁止队列进行函数转换(会导致列索引失效)
14.在明星不会有重复值使用UNION ALL 不使用UNION(UNION操作时会产生临时表占大量IO资源)
15.拆分复杂的大SQL为多个小SQL(每个SQL操作都只会分配一个CPU进行操作,当拆分成多个小SQL时会分配多个CPU进行操作,从而导致提升效率)
数据库操作行为规范:
1.超过百万行的批量写操作,要分批多次进行(大批量的写操作会造成严重的主从延迟)
2.对于大表使用PT-ONLINE-SCHEME-CHANGE修改表结构(避免大表修改产生的的延迟问题)
3.禁止为程序使用的账号使用SUPER权限
4.对于程序连接数据库账号,遵循权限最小原则,不准有drop权限
以上是关于mysql优化的主要内容,如果未能解决你的问题,请参考以下文章