zoukankan      html  css  js  c++  java
  • 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支持

  • 相关阅读:
    php判断字符串长度 strlen()与mb_strlen()函数
    Ajax
    MYSQL全文本搜索
    PHP读取xlsx Excel 文件
    PHP正则表达式
    语法环境 变量 数据类型 转换 销毁和传值
    语法环境 变量 数据类型 转换 销毁和传值
    hive并行执行作业; 强化在脑海的印象
    待解决问题 :JDBC indexInsert.addBatch(); 为什么不生效 PSTM
    Clickhouse副本表以及分布式表简单实践
  • 原文地址:https://www.cnblogs.com/hualingyun/p/10115757.html
Copyright © 2011-2022 走看看