美文网首页
【MySQL】MySQL 有哪些类型的索引?

【MySQL】MySQL 有哪些类型的索引?

作者: Bogon | 来源:发表于2023-04-22 11:31 被阅读0次

    MySQL官方对索引的定义是:索引(Index)是帮助MySQL高效获取数据的数据结构。
    索引最形象的比喻就是图书的目录。
    注意只有在大量数据中查询时索引才显得有意义。

    在MySQL中索引是在存储引擎层实现的,而不是在服务器层实现的,所以不同存储引擎具有不同的索引类型和实现。

    常见的索引分类如下:

    按数据结构分类:B+tree索引、Hash索引、Full-text索引。

    按物理存储分类:聚集索引、非聚集索引(也叫二级索引、辅助索引)。

    按字段特性分类:主键索引(PRIMARY KEY)、唯一索引(UNIQUE)、普通索引(INDEX)、全文索引(FULLTEXT)。

    按字段个数分类:单列索引、联合索引(也叫复合索引、组合索引)。

    image.png

    MySQL 支持以下几种类型的索引:

    1. 主键索引

    假设有一个用户表 users,其中 user_id 是主键,可以使用以下语句创建主键索引:

    CREATE TABLE users (
      user_id INT PRIMARY KEY,
      name VARCHAR(50),
      age INT
    );
    

    主键索引可以提高按照 user_id 查找用户信息的效率,例如:

    SELECT * FROM users WHERE user_id = 123;
    
    1. 唯一索引

    假设有一个订单表 orders,其中 order_number 是唯一索引,可以使用以下语句创建唯一索引:

    CREATE TABLE orders (
      order_id INT PRIMARY KEY,
      order_number VARCHAR(50) UNIQUE,
      customer_id INT,
      amount DECIMAL(10, 2)
    );
    

    唯一索引可以保证 order_number 的唯一性,例如:

    INSERT INTO orders (order_number, customer_id, amount)
    VALUES ('202201010001', 123, 100.00);
    

    如果再次插入相同的 order_number,将会报错。

    1. 普通索引

    假设有一个商品表 products,其中 category_id 是普通索引,可以使用以下语句创建普通索引:

    CREATE TABLE products (
      product_id INT PRIMARY KEY,
      name VARCHAR(50),
      price DECIMAL(10, 2),
      category_id INT,
      INDEX idx_category_id (category_id)
    );
    

    普通索引可以提高按照 category_id 查找商品信息的效率,例如:

    SELECT * FROM products WHERE category_id = 123;
    
    1. 全文索引

    假设有一个文章表 articles,其中 content 是全文索引,可以使用以下语句创建全文索引:

    CREATE TABLE articles (
      article_id INT PRIMARY KEY,
      title VARCHAR(50),
      content TEXT,
      FULLTEXT INDEX idx_content (content)
    );
    

    全文索引可以提高按照文章内容搜索文章的效率,例如:

    SELECT * FROM articles WHERE MATCH (content) AGAINST ('MySQL');
    
    1. 组合索引

    假设有一个订单表 orders,其中 customer_id 和 order_date 是组合索引,可以使用以下语句创建组合索引:

    CREATE TABLE orders (
      order_id INT PRIMARY KEY,
      customer_id INT,
      order_date DATE,
      amount DECIMAL(10, 2),
      INDEX idx_customer_date (customer_id, order_date)
    );
    

    组合索引可以提高按照 customer_id 和 order_date 查找订单信息的效率,例如:

    SELECT * FROM orders WHERE customer_id = 123 AND order_date BETWEEN '2022-01-01' AND '2022-01-31';
    
    1. 哈希索引

    假设有一个商品表 products,其中 barcode 是哈希索引,可以使用以下语句创建哈希索引:

    CREATE TABLE products (
      product_id INT PRIMARY KEY,
      name VARCHAR(50),
      price DECIMAL(10, 2),
      barcode VARCHAR(50),
      INDEX idx_barcode (barcode) USING HASH
    );
    

    哈希索引可以提高按照 barcode 查找商品信息的效率,例如:

    SELECT * FROM products WHERE barcode = '1234567890';
    
    1. 空间索引

    假设有一个商家表 businesses,其中 location 是空间索引,可以使用以下语句创建空间索引:

    CREATE TABLE businesses (
      business_id INT PRIMARY KEY,
      name VARCHAR(50),
      location POINT,
      SPATIAL INDEX idx_location (location)
    );
    

    空间索引可以提高按照经纬度查找附近商家的效率,例如:

    SELECT * FROM businesses WHERE ST_Distance_Sphere(location, POINT(121.5, 31.3)) < 1000;
    

    参考

    MySQL索引有哪些分类,你真的清楚吗?
    https://blog.csdn.net/u013635487/article/details/122469255

    MySQL 常见索引类型介绍
    https://mp.weixin.qq.com/s/rkcpL5ly75pfK5vvKRzo6w

    MySQL 10几种索引类型,你都清楚吗?
    https://www.51cto.com/article/747604.html

    Redis的几种拓展方案,你都清楚吗?
    https://www.51cto.com/article/681996.html

    相关文章

      网友评论

          本文标题:【MySQL】MySQL 有哪些类型的索引?

          本文链接:https://www.haomeiwen.com/subject/ofssjdtx.html