• 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支持

  • 相关阅读:
    Java学习开篇
    《我的姐姐》
    世上本无事,庸人自扰之
    这48小时
    补觉
    淡定
    es java api 设置index mapping 报错 mapping source must be pairs of fieldnames and properties definition.
    java mongodb groupby分组查询
    linux 常用命令
    mongodb too many users are authenticated
  • 原文地址:https://www.cnblogs.com/hualingyun/p/10115757.html
Copyright © 2020-2023  润新知