MySQL优化
Posted 咕咚萌西
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL优化相关的知识,希望对你有一定的参考价值。
使用explain关键字可以查看sql的执行计划用来观察sql对性能的影响.这里有explain的详细介绍http://blog.csdn.net/zhuxineli/article/details/14455029
一,sql查询语句的优化
1,关于sql语句的子查询可以优化成表连接的方式来查询,这里要考虑的是一对多的关系,如果出现一对多的关系的话可以使用distinct去除重复.
2,关于group by的优化需要根据实际情况灵活运用,group by可能会出现临时表(Using temporary),文件排序(Using filesort)等,影响效率。
可以通过关联的子查询,来避免产生临时表和文件排序,可以节省io.
3,关于limit的优化,1)通常limit的使用需要和order by一同使用,这时可以使用由索引的列或者主键列进行order by操作.
二,关于索引的优化
1,如何选择合适的索引
1)在where从句,group by从句,order by从句,on从句中出现的列建立索引
2)索引字段越小越好
3)离散度高的列放在联合索引的前面
select count(distinct row1),count(distinct row2) from table;
count()值大的就是离散程度高.
三,关于表结构的优化
1选择合适的数据类型
1)使用可以存下你数据的最小的数据类型
2)使用简单的数据类型.int要比carchar类型在mysql处理上简单
3)尽可能的使用not null定义字段.
4)尽量少用text类型,非用不可时最好考虑分表.
5)使用int类型存储日期
使用from_unixtime()将int类型转换为日期 使用unix_timestamp()将日期转换为int
6)使用int类型ip地址
使用inet_aton()将IP地址转化为bigint
使用inet_ntoa()将bigint转换为IP地址
2,使用第三范式的规范(用时间换取空间)
将表中重复量高的数据使用额外的一张表储存,也就是常见的商品详情和商品分类分开储存使用的时候做表连接进行查询.
3,使用反范式化(用空间换取时间)
不遵守范式化规范,将数据都放在一个表中用于减少关联查询提高查询效率.
关于是否要遵守范式化规范需要看实际情况(又水了一章)
4,为数据表做垂直拆分,将原来一个表的很多列拆分成多个列,解决表的宽度问题,通常拆分原则可以按一下进行
1),把不常用的字段单独存放单一个表中
2),八达的字段独立存放单一个表中
3)把经常一起使用的字段放到一起
5,为数据表做水平拆分,如果数据表数据量很大的话可以同时建立多个相同的数据表将数据分开存储,常用的水平才分方法为
1)对customer_id进行hash运算,如果要拆分成5个表则使用mod(customer_id,5)取出0-4个值
2)针对不同的hashID把数据存到不同的表中.
以上是关于MySQL优化的主要内容,如果未能解决你的问题,请参考以下文章