zoukankan      html  css  js  c++  java
  • MySQL优化(五) SQL 语句的优化 索引、explain

    一、索引

    1、分类

    (1)主键索引:当一张表的某个字段设置为主键时,该字段就是主键索引;

    (2)唯一索引:索引列中的值必须是唯一的,但是允许为空值(可以存在多个null);

    (3)普通索引:基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值,纯粹为了查询数据更快一点;

    (4)全文索引:全文索引,只有在MyISAM引擎上才能使用,只能在CHAR,VARCHAR,TEXT类型字段上使用全文索引,介绍了要求,说说什么是全文索引,就是在一堆文字中,通过其中的某个关键字等,就能找到该字段所属的记录行,比如有"你真的是一个好人" 通过“一个好人”,可能就可以找到该条记录。

      在模糊查询中使用全文索引:select * from user where match(name) against ('zhang')  格式: match(列名, ...) against ('搜索的关键字')。

      全文索引中,有一个叫做停止词。因为在一个文本中,创建索引是一个无穷大的数,所以对一些常用词和字符,就不会创建索引,这些词被称为停止词。

    2、查询索引

    show index(es) from 表名
    show keys from 表名

    3、为什么建立索引之后查询速度变快?

    因为索引使用了二叉树的数据结构,所以速度快;索引文件会占用磁盘空间;创建索引后进行增删改操作就会变慢,因为要重新调整二叉树;

    二、索引使用的注意事项

    1、在哪些列上适合添加索引?

    (1)列比较频繁的作为查询条件,应该创建索引

    (2)唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件;

    (3)更新非常频繁的字段不适合创建索引;

    (4)不会出现在 WHERE 子句中字段不该创建;

     2、索引的使用

    (1)查询要使用索引最重要的条件是查询条件中需要使用索引;

    (2)对于创建的多列索引,只要查询条件使用了索引中最左边的列,索引一般就会被使用;

    (3)对于使用 like 的查询,查询如果是 '%aaa' 不会使用到索引,'aaa%' 会使用到索引。

    3、不会使用索引的情况:

    (1)如果条件中有 OR,即使其中有条件带索引也不会使用;

    (2)对于多列索引,不是使用的最左边的列作为条件,则不会被使用;

    (3)like 查询以 % 开头,不会使用索引;即在 like 查询时,查询的关键字前面不能使用% (或 _)这样的字符,如果一定前面有变化的值,则考虑全文索引。

    (4)如果列类型是字符串,那一定要在条件中将数据使用引号引起来,否则不会使用索引;

    (5)如果Mysql 估计使用全表扫描要比使用索引快,则不使用索引;

    三、通过 explain 语句分析,mysql 如何执行你的 sql 语句

    explain查询sql执行计划,各列含义:
    table:表名;
    type:连接的类型

        -system:表只有一行
        -const:主键、索引。即表最多有一个匹配;
        -eq_reg:主键、索引的范围查找;
        -ref:连接的查找(join)
        -range:索引的范围查找;
        -index:索引的扫描;
        -all:全表扫描;
    possible_keys:可能用到的索引;
    key:实际使用的索引;
    key_len:索引的长度,越短越好;
    ref:索引的哪一列被使用了,常数较好;
    rows:mysql认为必须检查的用来返回请求数据的行数;
    extra:using filesort、using temporary(常出现在使用order by时)时需要优化。
        -Using filesort  额外排序。看到这个的时候,查询就需要优化了
        -Using temporary 使用了临时表。看到这个的时候,也需要优化。

  • 相关阅读:
    mysqldump 导出数据库为DBname的表名为Tname的表结构 导出数据库的所有表的表结构
    mysqldump 备份某张表 Warning: A partial dump from a server that has GTIDs will by default include the GTIDs of all transactions,
    nfs missing codepage or helper program, or other error
    date 增加一个小时 减少一个小时
    mysqldump 备份单个数据库
    mysql删除账户
    怎么删除某个用户的所有帖子?
    mongodb删除重复数据
    ReSharper2018破解详细方法
    激活windows和office
  • 原文地址:https://www.cnblogs.com/yufeng218/p/10035776.html
Copyright © 2011-2022 走看看