Mysql性能优化

 

  • MySQL优化是一个综合性技术,基本优化技术包括:
    • 表结构设计合理,符合最基本的3NF
    • 添加适当的索引:主键索引,普通索引,唯一索引,全文索引
    • 分表技术:水平分隔,垂直分隔
    • 存储过程,是一种预编译的执行计划,MySQL编译是比较耗时的,存储过程作为已编译的数据库对象可以提升查询速度
    • 修改MySQL配置文件,my.ini可以配置缓存大小、排序缓存大小、最大查询并发数等;
    • 读写分离,insert、delete、update是少频应用,select是高频应用,可以将增删改操作分发到独立的服务器,select操作分发到另外服务器(也可以是分布式服务器)

 

【会】使用索引

1、推荐使用  in

 SQL1:select datekey, revenue from compdeal_stat_weekly where datekey >= 20150504 and datekey <= 20150525 and cityid = 1 and siteid = 42 and classid = 226 and categoryid = -999;

SQL2:select datekey, revenue from compdeal_stat_weekly where datekey in (20150504, 20150511, 20150518, 20150525) and cityid = 1 and siteid = 42 and classid = 226 and categoryid=-999;

说明:周表用每周的周一标示本周交易信息,所以20150504~20150525中datekey只包含20150504, 20150511, 20150518, 20150525

二者执行计划分别如下

从执行计划中,我们发现二者都用到primary key,但是SQL1检索的rows达到609293行,而SQL2检索的rows只有4行,说明SQL1没有用到cityid, siteid, classid, categoryid这几个索引;

结论:使用索引字段最好不要出现>= <=这样对MySQL来说模糊的条件,而是使用确定性的查询条件,比如in

2、注意索引的顺序

查询需求:查询交易信息

 SQL1:select datekey, classid, categoryid, revenue from compdeal_stat_weekly where siteid = 42;
 SQL2:select datekey, classid, categoryid, revenue from compdeal_stat_weekly where datekey > 0 and siteid = 42;

说明:表中datekey全部是都是大于0的

二者执行计划分别如下:

从执行计划我们可以观察到:

  1. type:SQL1的type是ALL,表示全表扫描,也就是说没有用到索引;SQL2的type是range,以范围的形式使用索引
  2. key:SQL1的key为null,SQL2的key为primary,再次说明SQL1没有使用索引
  3. key_len:SQL1的key_len为null,没有用到索引,SQL2的key_len为4
  4. rows:SQL1的row为1218479,SQL2的rows为609293,是前者的一半

结论:对于复合索引,如果在查询条件中不使用前面的索引字段,只使用靠后的索引字段,是不会使用任何索引字段的;所以需要创造条件使用到左侧的索引字段;

  • 3、查询条件中如果有or,并且有不是索引字段作为查询条件,那么所有索引也不会使用;
  •  4、对于char或者vachar类型的字段使用索引进行查询时,like ‘%ly’,这种模糊查询不会使用到索引;like 'he%'可以使用索引;对于前者可以使用MySQL相应的function

 

你可能感兴趣的:(mysql)