可以从以下方面对数据库进行优化
目的是写出高效的sql语句,建立有效的索引。(重点)
数据库表结构为了避免join查询,可以适当的冗余一些字段。表结构的设计也会影响sql语句的编写,所以要合理建表。(其次)
系统配置方面,现在MySQL大多数运行在linux服务器上,可以设置tcp连接数等,还有mysql本身的缓存配置。(3)
硬件配置的优化。老板加钱就可以了。(4)
接下来就开始最底层也是最重要的sql以及索引优化。
sql以及索引优化
先查看MySQL的版本
在准备一些测试数据
再看一下这些表之间的关系,使用powerDisigner工具进行生成
如何发现有问题的sql语句?
使用MySQL的慢查询日志
上图是检查慢查询日志是否开启
没有走索引的加入日志
慢日志的分析工具
在线安装方式,可以避免版本兼容的问题
分析慢查询日志
有问题的sql特征:
慢查询的目的就是发现有问题的sql。
发现有问题的sql语句后,我们可以使用explain sql语句来查看执行这条sql的细节。
得到如下的信息
每个字段的含义:
2)select_type就是这张表在这个sql语句中处于什么地位。
3.表名
10.extra这个字段也很重要,相当于额外的说明。
实际的SQL语句优化
1.对于max()函数的优化
例如订单表中查询最后的订单时间
查看执行计划
加/G,格式化数据
缺陷:可以看到受影响的行数很多
解决方法:在查询的字段上建立索引
效果立竿见影。
2.对count()进行优化
count()函数统计具体的列中数据量时,如果列中数据有为null值的,则不参与统计。实际count(列名)就是统计列中非null的数据数。
就算表中只有一列数据也是这样的。
3.子查询的优化
子查询就是select * from table_name where table_name.id in (select table_name2.id from table_name2);
上面就是子查询语句。最好改成join格式
select * from table_name join table_name2 on table_name.id = table_name2.id;
可以看到join查询比子查询少一张表的查询。
出现了一对多的情况:
但是需要注意join操作会造成数据重复的问题,例如表二中有两个相同的id,则在表一的查询结果中也会出现两条相同的结果。所以需要使用distinct关键字进行结果去重。
子查询不会出现重复数据。
4.group by的优化
group by 优化的方向:先在join子句中分好组,统计好数量,再连接。
5.limit语句优化
这种需要扫描所有的行数据
优化方式一:使用order by主键(自增)
但是这种方式还是存在弊端,例如扫面1000-1005的数据,还是需要扫描1005行。
优化方式二:在优化一的基础上,加入where查询,设定查询范围
注意:优化二方式。
索引的优化
索引的含义,就是相当于数据前面的目录,可以快速定位数据。但是索引不是越多越好。
创建索引:
哪些列适合做索引?
1.作为where,order by ,group by ,on子句的列
2.离散程度大的列放在联合索引的最前方。
3.索引字段越小越好。可以取列数据的前几位做索引。
联合索引的规则:
1.符合最左匹配原则,在where条件中最好全部出现,必须出现最左的字段,否则也不走联合索引。
2.如果在where的条件关系是or,则联合索引失效
3.数据量小的字段不要加索引
去掉重复和冗余的索引。
不经常使用的索引,及时删除。
索引不会包含有NULL值的列。
数据表设计可以存在一些字段的冗余,减少join查询。