• mysql 优化--四(索引及匹配方式,通过explain进行判断)


    一、mysql索引匹配

    全值匹配值的是和索引中所有的列进行匹配

    先说一下mysql官网中资料,官网中提供的sql语句,几乎是基于下图中几个数据库中演练的

    https://dev.mysql.com/doc/index-other.html

     以sakila database 为例

    1、将下载的sakila database 导入到mysql中

     进入sakila 库中:

     具体每张表对应的关系可以通过view观察

    创建一张表

    DROP TABLE IF EXISTS `staffs`;
    CREATE TABLE `staffs`  (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,
      `age` int(5) NOT NULL,
      `pos` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL,
      `add_time` datetime(0) NULL DEFAULT NULL,
      PRIMARY KEY (`id`) USING BTREE,
      INDEX `index`(`name`, `age`, `pos`) USING BTREE
    ) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
    
    SET FOREIGN_KEY_CHECKS = 1;

    全值匹配 :

    explain select * from staffs  where name ='Jon' and age = '23';

    id:选择标识符   --SELECT识别符。这是SELECT的查询序列号
    select_type:表示查询的类型。
    table:输出结果集的表
    partitions:匹配的分区
    type:表示表的连接类型          ALL、index、range、 ref、eq_ref、const、system、NULL(从左到右,性能从差到好)
    possible_keys:表示查询时,可能使用的索引
    key:表示实际使用的索引
    key_len:索引字段的长度
    ref:列与索引的比较 ,const(常量值)
    rows:扫描出的行数(估算的行数,不是真实执行的行数)
    filtered:按表条件过滤的行百分比
    Extra:执行情况的描述和说明

    匹配最左前缀:

     此时ref有两个常量值

     

    匹配列前缀:

     

     此时ref是null,type 是要求最小的range

    匹配范围值:

     

    精确匹配某一列并范围匹配另外一列:

     

    它与最左前缀是不同的

     type和ref列的值是不同的,此时pos是无关值

    只访问索引的查询:

     extra 这一列出现了using index 说明出现了索引覆盖

    题外话:回表出现的充分必要条件是普通索引

     二、哈希索引

    1、基于哈希表实现,只有精确匹配索引所有列的查询才有

    2、在mysql 中只有memory存储引擎支持哈希索引

    3、哈希索引自身只需要存储对应的hash值,所以索引的结构十分紧凑,查询的速度非常快

    哈希索引的限制:

    1、哈希索引只包含哈希值和行指针,而不存储字段值,索引不能使用索引中的值还避免读取行

    2、哈希表无法排序

    3、不支持部分列匹配查找,哈希索引时使用索引列的全部内容来计算哈希值

    4、哈希索引支持等值比较查询,不支持任何范围查询

    5、如果有很多哈希冲突,存储引擎必须遍历链表中所有行指针,逐行比较,知道找到所有符合条件的行

     二、组合索引

    1、当包含多个列作为索引,需要注意正确的的顺序依赖于该索引的查询,需要考虑如何更好的满足排序和分组的需要

    案例:

    现在建立了a,b,c组合索引:

      where a = 3 只使用a
      where a= 3 and b = 5 使用a,b
      where a= 3 and b = 5 and c = 7 使用a,b,c
      where b = 5 and c = 7 没有使用
      where a= 3 and c = 7 只使用a
      where a= 3 and b > 5 and c = 7 使用a,b
      where a= 3 and b like '%4%' and c = 7 只使用a
  • 相关阅读:
    【正则表达式】正则表达式基础语法
    【JavaWeb】实现二级联动菜单
    【JavaWeb】jQuery对Ajax的支持
    MySQL复习值代码知识点(2)
    easyUI+servlet+mysql项目总结
    Android环境配置(Eclipse全开发环境下载)
    jsp+servlet+mysql简单实现用户登陆注册
    java的异常抛出throws和throw的简单使用
    关于Java的多线程Runnable的个人理解(基础,不讲概念)
    Eclipse中代码自动添加注释及代码注释模板
  • 原文地址:https://www.cnblogs.com/alomsc/p/15464638.html
Copyright © 2020-2023  润新知