Mysql数据库性能优化,可以从下面三点入手:
数据库设计
SQL语句优化
架构优化
一.数据库设计优化
1.适度的违反范式,适度 遵循三大范式就会带来查询时经常需要join,导致查询效率降低 基于性能要求结合业务,适度的做冗余
2.适度的建立索引
IO(更新操作速度会降低,索引的操作),存储空间
建立索引的规则:
a.索引的字段必须是经常用来作为查询条件的字段
b.所以是多个字段的情况,第一个字段要是经常作为查询条件的
c.索引的字段必须有足够的区分度
3.对表进行水平划分
每年都有10万条数据,将这个表按照年区分建立表 log log_2016 log_2015
4.对表进行垂直划分
字段很长,占用空间较大 检索表的时候就需要进行大量的I/O 将字段独立出一张表跟原表建立1对1的关系
5.选择适当的字段类型
6.文件图片等大文件用硬盘存储,挂载存储,不用数据库,数据库中只存储文件路径
7.外键要表示清楚 实际工作中大部分不会建立外键
8.宁可集中批量操作也不要频繁读写
9.选择合适的引擎
二.SQL优化
1.慢日志,explain
2.避免全表扫描, 考虑在where和order by 的列建立索引
3.尽量避免在where子句中使用null值判断。Where username is null 放弃使用索引进行全表扫描,设计默认值 例如:0
4.尽量避免在where子句中使用!=||<>,放弃索引,走全表扫描 可以使用< ,<=, =, > ,>= ,between ,in会走扫描
5.尽量避免在where字句中使用 or 来连接,放弃扫描 走全表扫描,可以使用union all
6.能用between 实现就不要使用in
7.Like避免使用 %%查询 不会走索引。Abc%会走索引
8.查询的时候尽量不要使用*作为结果列,仅列出需要查询的字段,节省应用服务器的内存
9.在where中,尽量避免做列运算,尽量避免使用函数,不走索引,走全表扫面
10.Join操作 小的结果驱动大的结果
11.分页在基数比较大时,不要用limit 尽量换成 between
12.不要使用rand获取随机条数记录
13.不要使用count(列名)表示多少个不为空 记录 使用count(*,1)整个结果集有多少条记录
14.不要做无谓的排序操作
15.出现了局部变量时,可以强制使用索引 with(index(索引名))
16.尽量避免对字段使用表达式操作 selet 1 from table where num/2=100 num=100*2
17.用exists 代替 in
18.索引并不是越多越好,做好不要超过6个
19.尽量使用数字型字段
20.尽量避免创建临时表
21.尽量避免使用游标,游标操作超过1万条记录 必须考虑改写
22.尽量避免大事务操作,索引优化
三.架构优化
1.数据库参数配置 ,具体更多的优化配置 innodb_buffer_pool_size=5g key_buffer_size
2.合理的硬件资源和操作系统 大部分64位的操作系统 和 64位mysql数据库
3.读写分离 通过mysql的复制机制实现多台机器同步,将数据库的压力分散