mysql性能优化
Posted 皇甫哲
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql性能优化相关的知识,希望对你有一定的参考价值。
性能优化
myql数据库优化的原则:
1.减少系统的瓶颈。
2.减少资源的占用。
3.增加系统的反应速度。
优化查询
1.索引对查询的影响
比如有一个表student表,有id、name、sex、no,4个字段,里面有20条记录,如果没有索引时,查询no=20的学生。
sql语句是SELECT * from student WHERE no =\'20\'。分析当前sql :执行 explain SELECT * from student WHERE no =\'20\'
这样可以看到rows是20,也就是说查询扫描了20条记录。
- select_type:SIMPLE,这个不是很关键,只是表示这是一次简单的查询,没有join,没有union,没有中间表
- type:ALL,表示该次SQL进行了全表查询
在no字段使用索引后
看到结果是1,证明查询的时候只扫描了一条记录。查询速度自然比不使用索引快。而且possible_keys和key都可以说明使用了索引。
2.使用索引查询
(1)使用like查询时
如果第一个字符是%,索引不起作用,只要%不在第一位置索引才起作用。
(2)使用多列索引查询
mysql可以为多个字段创建索引,一个索引可以包含16个字段,只有查询条件中使用了这些字段的第一个字段时,索引才有用。
(3)使用or关键字查询
查询条件只有or关键字,且or前后两个条件都是索引时,查询才会使用索引。
3.避免使用select *
查询内容越多,自然越慢。
4.永远为每张表设置一个id
表里设置一个id作为主键,最好是int类型,并加上自增标识。使用varchar当做主键会使性能下降。
数据库结构优化
1.将字段很多的表分解为多个表
对于字段很多的表,如果有些字段使用的频率很低,可以将这些字段分离出来形成新表。因为一个表数据量很大时,会由于使用频率低的字段存在而变慢,通过分解字段,可以提高表的查询效率。
2.增加中间表
对于需要经常联合查询的表,可以建立中间表以提高查询的效率。把经常要联合查询的数据插入到中间表,然后将原来联合查询改为对中间表的查询,以此来提高表的查询效率。
3.优化插入记录的速度
影响插入速度主要是索引、唯一性校验、一次插入的条数。以InnoDB表为例。
(1)禁止唯一性检查
插入数据时,mysql会对插入的记录。唯一性校验会降低插入记录的速度。等记录插入完毕后再开启。
SET UNIQUE_CHECKS = 0;开启
SET UNIQUE_CHECKS = 1;关闭
(2)禁止外键检查
插入数据之前禁止对外键的检查,数据插入后再恢复对外键的检查。
SET foreign_key_checks = 0;
SET foreign_key_checks = 1;
(3)禁止自动提交
插入数据之前禁止事务的自动提交,数据导入后再恢复。
SET autocommit = 0;
SET autocommit = 1;
数据库优化
1.优化表的结构,对常用字段和非常用的字段分开存储。
2.优化sql合理使用索引。
3.做数据库读写分离,减少io压力。因为数据库对记录做持久化并存储在磁盘上,对磁盘的io是非常消耗性能的操作,因此,读写在一个库中会大大增加io的压力。
4.尝试使用缓存,不要让数据都走数据库。
5.对业务做垂直拆分。
6.对表做水平拆分。
合理使用所以对性能提升至关重要。
如果索引建立在重复数据很少的字段上效果明显,对于重复数据量大的字段就不见得会提升效率。
对索引列使用函数会导致索引失效。技巧:对索引列不使用函数而对常数项使用函数,索引就有效了。
以上是关于mysql性能优化的主要内容,如果未能解决你的问题,请参考以下文章
MySQL 数据库 Schema 设计的性能优化①:高效的模型设计