(转)仅供自己学习,特此转发
普遍遇到的慢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支持