Mysql性能优化实战

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33661044/article/details/79435571

1、索引设计规范
常见索引列建议:
SELECT、UPDATE、DELETE语句的WHERE从句中的列
包含在ORDER BY、GROUP BY、DISTINCT中的字段,建议联合索引
多表JOIN的关联列
索引列的顺序:
区分度最高的列放在联合索引的最左侧
尽量把字段长度小的列放在联合索引的最左侧
使用最频繁的列放到联合索引的左侧
总结:
每个innodb表都要有一个主键
限制表上索引的数量,避免建立重复索引和冗余索引
注意合理选择复合索引键值的顺序
数据库字段设计规范
优先选择符合存储需要的最小数据类型
将字符串转化为数字类型存储;使用inet_aton()函数和inet_neoa()函数转化字符串
对于非负数据采用无符号整型进行存储
varchar(n)中的n代表的是字符数,而不是字节数
避免使用text、blob数据类型
避免使用enum值修改enum值需要使用alter语句,order by 操作效率低,需要额外操作
尽可能把所有列定义为Not null.所有null列需要额外空间来保存
同财务相关的金额必须使用decimal类型
数据库SQL开发规范
建议使用预编译语句进行数据库操作
避免数据类型隐式转换,会导致索引失效
充分利用表上已经存在的索引,避免使用双%号的查询条件,一个sql只能利用到复合索引中的一列进行范围查询(其它列的索引会失效)、使用left join或not exists来优化not in操作
禁止使用select * 查询,这将消耗更多的cpu和io以及网络带宽资源,无法使用覆盖索引
避免使用子查询,可以把子查询优化为Join操作。子查询返回的结果集无法使用索引,子查询会产生临时表,消耗过多的CPU以及IO操作
避免使用JOIN关联表
使用in代替or ,in的值不要超过500个,更好的利用索引
禁止使用 order by rand()进行随机排序
禁止在where从句中堆列进行函数转化和计算,会导致无法使用索引。
在明显不会有重复值时使用union all而不是union。union会把所有数据放到临时表中后再进行去重操作。union all 不会再对结果集进行去重操作。
拆分复杂的大sql为小sql,mysql一个sql只能使用一个cpu进行计算

猜你喜欢

转载自blog.csdn.net/qq_33661044/article/details/79435571