MySql中sql如何优化

  这篇文章主要介绍了MySql中sql怎么优化,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
 
  一、explain返回列简介
  1、type常用关键字
  system > const > eq_ref > ref > range > index > all。
 
  system:表仅有一行,基本用不到;
  const:表最多一行数据配合,主键查询时触发较多;
  eq_ref:对于每个来自于前面的表的行组合,从该表中读取一行。这可能是最好的联接类型,除了const类型;
  ref:对于每个来自于前面的表的行组合,所有有匹配索引值的行将从这张表中读取;
  range:只检索给定范围的行,使用一个索引来选择行。当使用=、<>、>、>=、<、<=、IS NULL、<=>、BETWEEN或者IN操作符,用常量比较关键字列时,可以使用range;
  index:该联接类型与ALL相同,除了只有索引树被扫描。这通常比ALL快,因为索引文件通常比数据文件小;
  all:全表扫描;
  实际sql优化中,最后达到ref或range级别。
 
  2、Extra常用关键字
  Using index:只从索引树中获取信息,而不需要回表查询;
 
  Using where:WHERE子句用于限制哪一个行匹配下一个表或发送到客户。除非你专门从表中索取或检查所有行,如果Extra值不为Using where并且表联接类型为ALL或index,查询可能会有一些错误。需要回表查询。
 
  Using temporary:mysql常建一个临时表来容纳结果,典型情况如查询包含可以按不同情况列出列的GROUP BY和ORDER BY子句时;
 
  索引原理及explain用法请参照前一篇:MySQL索引原理,explain详解
 
  二、 单表sql优化
  1、删除student表中的联合索引。
 
  2、添加索引
  alter table student add index student_union_index(name,age,sex);
 
  优化一点,但效果不是很好,因为type是index类型,extra中依然存在using where。
 
  3、更改索引顺序
  因为sql的编写过程
 
  select distinct … from … join … on … where … group by … having … order by … limit …
  解析过程
 
  from … on … join … where … group by … having … select distinct … order by … limit …
  因此我怀疑是联合索引建的顺序问题,导致触发索引的效果不好。are you sure?试一下就知道了。
 
  alter table student add index student_union_index2(age,sex,name);
  删除旧的不用的索引:
 
  drop index student_union_index on student
  索引改名
 
  ALTER TABLE student RENAME INDEX student_union_index2 TO student_union_index
  更改索引顺序之后,发现type级别发生了变化,由index变为了range。
 
  range:只检索给定范围的行,使用一个索引来选择行。

【声明】:芜湖站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

相关文章