• MySQL:索引


    通过建立索引,可以根据索引来快速找到想要的一条记录,大大提高查询效率

    单列索引

    单列索引只针对于某一列数据创建索引,单列索引有以下几种类型:

    • NORMAL:普通的索引类型,相当于一本书的目录。

    • UNIQUE:唯一索引,一旦建立唯一索引,那么整个列中将不允许出现重复数据。每个表的主键列,都有一个特殊的唯一索引,叫做 Primary Key,它不仅仅要求不允许出现重复,还要求不能为 NULL,它还可以自动递增。每张表可以有多个唯一索引,但是只能有一个 Primary 索引。

    • SPATIAL:空间索引,空间索引是对空间数据类型的字段建立的索引,MYSQL 中的空间数据类型有 4 种,分别是 GEOMETRY、POINT、LINESTRING、POLYGON,不常用

    • FULLTEXT:全文索引(MySQL 5.6 之后 InnoDB 才支持),它是模糊匹配的一种更好的解决方案,它的效率要比使用like %更高,并且它还支持多种匹配方式,灵活性也更加强大。只有字段的数据类型为 char、varchar、text 及其系列才可以建全文索引。

    我们来看看如何使用全文索引,首先创建一张用于测试全文索引的表:

    CREATE TABLE articles (
      id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
      title VARCHAR(200),
      body TEXT,
      FULLTEXT (body));
    INSERT INTO articles VALUES
        (NULL,'MySQL Tutorial', 'DBMS stands for DataBase ...'),
        (NULL,'How To Use MySQL Efficiently', 'After you went through a ...'),
        (NULL,'Optimising MySQL','In this tutorial we will show ...'),
        (NULL,'1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
        (NULL,'MySQL vs. YourSQL', 'In the following database comparison ...'),
        (NULL,'MySQL Security', 'When configured properly, MySQL ...');

    最后我们使用全文索引进行模糊匹配:

    SELECT * FROM articles WHERE MATCH (body) AGAINST ('database');

    match 中是字段,against 中定义需要模糊匹配的字符串,我们用作查找的字符串实际上是被分词之后的结果,如果进行模糊匹配的不是一个词语,那么会查找失败,但是它的效率远高于以下这种写法:

    SELECT * FROM articles WHERE body like '%database%';

    组合索引

    组合索引实际上就是将多行捆绑在一起,作为一个索引,它同样支持以上几种索引类型

    注意组合索引在进行匹配时,遵循最左原则。

    我们可以使用explain语句(它可以用于分析 select 语句的执行计划,也就是 MySQL 到底是如何在执行某条 select 语句的)来分析查询语句到底有没有通过索引进行匹配。

    explain select * from student where name = '小王';

    得到的结果如下:

    • select_type:查询类型,上面的就是简单查询(SIMPLE)

    • table:查询的表

    • type:MySQL 决定如何查找对应的记录,效率从高到低:system > const > eq_ref > ref > range > index > all

    • possible_keys:执行查询时可能会用到的索引

    • key:实际使用的索引

    • key_len:Mysql 在索引里使用的字节数,字段的最大可能长度

    • rows:扫描的行数

    • extra:附加说明

  • 相关阅读:
    【学习笔记44】JavaScript的事件传播
    绘图(二)五子棋小游戏
    简易下载并使用Jupyter(Anaconda)
    LoRaWAN 网络(网关和终端设备)的模拟实现--附源码
    【EasyRL学习笔记】第十一章 模仿学习
    杂记 | 使用阿里云函数计算服务代理OpenAI的API接口
    ROS noetic
    动态近场通信标签:如何使用C++与微控制器进行NFC交互的完整指南
    一文学会鉴别“套壳”ChatGPT模型
    你知道视频怎么去水印吗?试试这三个方法学会怎么去视频水印
  • 原文地址:https://blog.csdn.net/weixin_51992178/article/details/127670954