sql语句的优化

(转)仅供自己学习,特此转发

普遍遇到的慢SQL有以下三种:

 1.未走索引
 2.where条件里包含子查询,多表联查
 3.查询大量数据

但凡优化SQL,首先要看的就是这条查询是否走了索引。走索引的查询和没走索引的差距可谓云泥之别。

可以看下面这个例子:

在一张大约3W数据量的用户表中,两种查询方式在速度上的差距:

不走索引:

select * from kw_user_copy where new_id=1
时间: 0.321 s

走主键索引:

select * from kw_user_copy where id=1
时间: 0.002 s

执行时间上有着数百倍的差距。

这种差距如果放在一些大的嵌套中,譬如循环查询500次,将成为非常致命的问题,甚至可能让程序执行超时。

一.索引:SQL中的高速公路

实际项目中的例子:

select id as user_id, name, nickname, photo, status, sdk_key, sdk_status from kw_user where name = 'wallkop' AND password = '44209a6a592dea91bcf7d4dd53e47a5a'

时间: 0.247 s

这是一条非常常见的用户登录查询。

直观看起来,这条SQL似乎写的非常完善了,根据name和password去查询相关用户的信息,怎么看都没有优化的余地了。

我们也知道:name和password作为两个string字段,通常是不会建立索引的,也就是说,这是一条必然不走索引的查询。

这种查询就没有优化余地了吗?

非也。

下面就是一个简单的优化:

select id from kw_user where name = 'wallkop' AND password = '44209a6a592dea91bcf7d4dd53e47a5a'
时间: 0.060 s
 
select id as user_id, name, nickname, photo, status, sdk_key, sdk_status from kw_user where id=37215
时间: 0.001 s
 
总耗时:0.061 s

将一条查询语句拆成两条,第一条不走索引的查询,我们尽量去简化它,只查一个id字段,你会惊奇的发现:速度居然提升了4倍。

而第二条查询用户详细信息的SQL,我们走了主键索引,仅仅用了0.001s。

如此一来,两条查询加起来总耗时才0.061s,比之前快了4倍。

这就是索引的灵活运用之道。

5、选择数据库引擎时要注意innodb 和 myisam的区别。
  存储结构:MyISAM在磁盘上存储成三个文件。而InnoDB所有的表都保存在同一个数据文件中,一般为2GB
  事务支持:MyISAM不提供事务支持。InnoDB提供事务支持事务。
  表锁差异:MyISAM只支持表级锁。InnoDB支持事务和行级锁。
  全文索引:MyISAM支持 FULLTEXT类型的全文索引(不适用中文,所以要用sphinx全文索引引擎)。InnoDB不支持。
  表的具体行数:MyISAM保存有表的总行数,查询count(*)很快。InnoDB没有保存表的总行数,需要重新计算。
  外键:MyISAM不支持。InnoDB支持

posted on 2018-12-13 18:56  泽一年  阅读(140)  评论(0编辑  收藏  举报

导航