阅读打卡mysql部分汇总(3)| 青训营笔记

107 阅读5分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 9 天

MySQL索引

  • 机制

    • 创建 方式

      • create [给一张已存在的表结构添加索引]

        • CREATE INDEX/KEY indexName ON tableName (columnName(length) [ASC|DESC]);
        • indexName:当前创建的索引,创建成功后叫啥名字。
        • tableName:要在哪张表上创建一个索引,这里指定表名。
        • columnName:要为表中的哪个字段创建索引,这里指定字段名。
        • length:如果字段存储的值过长,选用值的前多少个字符创建索引。
        • ASC|DESC:指定索引的排序方式,ASC是升序,DESC是降序,默认ASC。
      • ALTER TABLE tableName ADD INDEX indexName(columnName(length) [ASC|DESC]);
      • 建表时DDL语句中创建 [适合在库表设计时,已经确定了索引项的情况下建立]
    • 指定索引的查询、删除

      • SHOW INDEX FROM tableName;

        • ①Table:当前索引属于那张表。
        • ②Non_unique:目前索引是否属于唯一索引,0代表是的,1代表不是。
        • ③Key_name:当前索引的名字。
        • ④Seq_in_index:如果当前是联合索引,目前字段在联合索引中排第几个。
        • ⑤Column_name:当前索引是位于哪个字段上建立的。
        • ⑥Collation:字段值以什么方式存储在索引中,A表示有序存储,NULL表无序。
        • ⑦Cardinality:当前索引的散列程度,也就是索引中存储了多少个不同的值。
        • ⑧Sub_part:当前索引使用了字段值的多少个字符建立,NULL表示全部。
        • ⑨Packed:表示索引在存储字段值时,以什么方式压缩,NULL表示未压缩,
        • ⑩Null:当前作为索引字段的值中,是否存在NULL值,YES表示存在。
        • ⑪Index_type:当前索引的结构(BTREE, FULLTEXT, HASH, RTREE)。
        • ⑫Comment:创建索引时,是否对索引有备注信息。
      • SELECT * FROM table_name FORCE INDEX(index_name) WHERE .....; [FORCE INDEX关键字可以为一条查询语句强制指定走哪个索引查询]
      • DROP INDEX indexName ON tableName;
  • 分类

    • 数据结构层次

      • CREATE INDEX indexName ON tableName (columnName(length) [ASC|DESC]) USING HASH;//指定数据结构
      • B+Tree类型:MySQL中最常用的索引结构,大部分引擎支持,有序。
      • Hash类型:大部分存储引擎都支持,字段值不重复的情况下查询最快,无序。
      • R-Tree类型:MyISAM引擎支持,也就是空间索引的默认结构类型。
      • T-Tree类型:NDB-Cluster引擎支持,主要用于MySQL-Cluster服务中。
    • 字段数量层次

      • 前缀索引

        • length:如果字段存储的值过长,选用值的前多少个字符创建索引。
      • 单列

        • 唯一索引:指索引中的索引节点值不允许重复,一般配合唯一约束使用。
        • 主键索引:主键索引是一种特殊的唯一索引,和普通唯一索引的区别在于不允许有空值。

          • 在主键字段上建立的索引被称为主键索引
          • 非主键字段上建立的索引一般被称为辅助索引或、二级索引或次级索引
        • 普通索引:通过KEY、INDEX关键字创建的索引就是这个类型,没啥限制,单纯的可以让查询快一点。
      • 多列/组合/联合/复合/多值索引
    • 功能逻辑层次

      • 全文索引

        • 类似于ES、Solr搜索中间件中的分词器,和之前常用的like+%模糊查询很类似
        • 只能创建在CHAR、VARCHAR、TEXT等这些文本类型字段上
        • 条件字符数量必须大于3才生效
      • 空间索引——GIS空间数据(GEOMETRY、POINT、LINESTRING、POLYGON等类型)
    • 存储方式层次

      • 聚簇索引:逻辑上连续且物理空间上的连续(非空唯一索引)(一般适合采用带有自增性的顺序值)
      • 非聚簇索引:逻辑上的连续,物理空间上不连续。
  • 其他索引的创建使用

    • 唯一索引UNIQUE
    • 主键索引PRIMARY
    • 全文索引FULLTEXT

      • note

        • 5.6版本的MySQL中,存储引擎必须为MyISAM才能创建。
        • 创建全文索引的字段,其类型必须要为CHAR、VARCHAR、TEXT等文本类型。
        • 如果想要创建出的全文索引支持中文,需要在最后指定解析器:with parser ngram。
      • 参数 查询命令show variables like '%ft%';

        • ft_min_word_len:使用MyISAM引擎的表中,全文索引最小搜索长度。
        • ft_max_word_len:使用MyISAM引擎的表中,全文索引最大搜索长度。
        • ft_query_expansion_limit:MyISAM中使用with query expansion搜索的最大匹配数。
        • innodb_ft_min_token_size:InnoDB引擎的表中,全文索引最小搜索长度。
        • innodb_ft_max_token_size:InnoDB引擎的表中,全文索引最大搜索长度。
        • ft_query_expansion_limit, 是控制拓展搜索时的拓展行数的
      • 关键字

        • MATCH()主要是负责指定要搜索的列,这里要指定创建全文索引的字段
        • AGAINST()则指定要搜索的关键字,也就是要搜索的词语
      • 搜索模式

        • 自然语言模式
        • 布尔搜索模式 IN BOOLEAN MODE

          • 语法

            • +:表示必须匹配的行数据必须要包含相应关键字。
            • -:和上面的+相反,表示匹配的数据不能包含相应的关键字。
            • :提升指定关键字的相关性,在查询结果中靠前显示。

            • <:降低指定关键字的相关性,在查询结果中靠后显示。
            • ~:表示允许出现指定关键字,但出现时相关性为负。
            • :表示以该关键字开头的词语,如A,可以匹配A、AB、ABC....
            • "":双引号中的关键字作为整体,检索时不允许再分词。
            • "X Y"@n:""包含的多个词语之间的距离必须要在n之间,单位-字节
        • 查询拓展搜索WITH QUERY EXPANSION

          • 首先会根据指定的关键字MySQL进行一次全文检索。
          • 然后第二阶段还会对指定的关键进行分词,然后再进行一次全文检索。
    • 空间索引 SPATIAL
    • 联合索引

      • SELECT语句的查询条件中,必须包含组成联合索引的第一个字段,此时才会触发联合索引