MySQL官方对索引的定义是:索引(Index)是帮助MySQL高效获取数据的数据结构。
索引最形象的比喻就是图书的目录。
注意只有在大量数据中查询时索引才显得有意义。
在MySQL中索引是在存储引擎层实现的,而不是在服务器层实现的,所以不同存储引擎具有不同的索引类型和实现。
常见的索引分类如下:
按数据结构分类:B+tree索引、Hash索引、Full-text索引。
按物理存储分类:聚集索引、非聚集索引(也叫二级索引、辅助索引)。
按字段特性分类:主键索引(PRIMARY KEY)、唯一索引(UNIQUE)、普通索引(INDEX)、全文索引(FULLTEXT)。
image.png按字段个数分类:单列索引、联合索引(也叫复合索引、组合索引)。
MySQL 支持以下几种类型的索引:
- 主键索引
假设有一个用户表 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;
- 唯一索引
假设有一个订单表 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,将会报错。
- 普通索引
假设有一个商品表 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;
- 全文索引
假设有一个文章表 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');
- 组合索引
假设有一个订单表 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';
- 哈希索引
假设有一个商品表 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';
- 空间索引
假设有一个商家表 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
网友评论