mysql优化

可以从以下方面对数据库进行优化

目的是写出高效的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查询。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值