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

2023-04-22  本文已影响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

上一篇 下一篇

猜你喜欢

热点阅读