SQL索引优化

SQL 索引简介

索引 是一种数据结构,它帮助数据库管理系统(DBMS)快速查找和检索数据,就像书籍中的目录一样,可以加速查找特定的信息。通过索引,查询操作可以大大提高效率,尤其是在数据量庞大的情况下。

1. 常见的索引类型

  • 单列索引(Single-column Index):只有一个列作为索引。
  • 复合索引(Composite Index):由多个列组成的索引。复合索引的顺序非常重要,查询时需要考虑列的顺序。

2. 创建索引

sql 复制代码
创建单列索引:
CREATE INDEX idx_column_name ON table_name (column_name);
sql 复制代码
创建复合索引:
CREATE INDEX idx_column1_column2 ON table_name (column1, column2);
sql 复制代码
创建唯一索引:
CREATE UNIQUE INDEX idx_column_name ON table_name (column_name);
sql 复制代码
创建全文索引:
CREATE FULLTEXT INDEX idx_column_name ON table_name (column_name);

3. 删除索引

sql 复制代码
普通索引 删除:DROP INDEX index_name ON table_name;
主键索引 删除:ALTER TABLE table_name DROP PRIMARY KEY;

4. 查询某表的索引

sql 复制代码
可以使用 SHOW INDEX 命令来查看某个表的索引。
SHOW INDEX FROM table_name;

5.查看sql使用了哪个索引 、是否使用了索引

sql 复制代码
EXPLAIN 你的SQL语句
EXPLAIN SELECT * FROM your_table WHERE column = 'xxx';
查询到的结果

执行后会得到一张表,其中关键字段是:

字段 含义
key 使用的索引名(最重要)
key_len 索引使用长度
rows 预计扫描的行数
type 访问类型(越优越好:const > ref > range > index > ALL)
判断是否走索引看 key 字段
  • key 有值 → 使用了某个索引
  • key 为 NULL → 没有使用索引(走全表扫描)

例子

EXPLAIN SELECT * FROM users WHERE name = 'Tom';

id select_type table type key rows
1 SIMPLE users ref idx_name 10
  • key = idx_name → 使用了 idx_name 索引
  • type = ref → 索引利用得不错
  • rows = 10 → 扫描很少的行,说明索引命中效果好

没走索引的例子
id select_type table type key rows
1 SIMPLE users ALL NULL 100000
  • key = NULL → 完全没用索引
  • type = ALL → 全表扫描(最差)

6.索引的优缺点

  • 优点:

    • 加速查询:特别是在进行大量数据检索时,索引能够显著提高查询速度。

    • 提高排序和分组效率 :索引有助于加速 ORDER BY 和 GROUP BY 等操作。

    • 优化连接查询:在执行多表连接查询时,索引可以提高效率。

  • 缺点:

    • 占用空间:每个索引都需要存储在磁盘上,会占用额外的存储空间。

    • 性能开销:插入、删除、更新操作时,索引需要进行相应的更新,这会增加操作的开销。

    • 维护成本:随着数据的增加,索引的维护也会变得更加复杂和耗时。

总结

索引是数据库中非常重要的性能优化工具,可以极大提高查询效率,但在创建和管理索引时需要谨慎。合理的索引设计可以帮助数据库在大数据量时保持良好的性能,而过多的索引或不合理的索引则会影响写入操作并占用大量存储空间。

相关推荐
编程火箭车24 分钟前
MySQL 拥抱 AI:向量、RAG、AutoML 全进了数据库
数据库·mysql·ai编程·向量数据库·rag·automl·mysql9
用户8662978480081 小时前
KingbaseES 中文乱码、排序不对?区域和字符集的问题,一次说清
数据库
aruo1 小时前
回退旧镜像之前,先确认数据库还能兼容
数据库
张洛闻Eren1 小时前
Ansible【第三课】:管理变量和事实
数据库·oracle
weixin_382395232 小时前
0-500 人工厂的生产 PMC 系统怎么做?基于 Tauri + SQLite 的性能架构实践与 5000 物料压测实录
数据库·架构·sqlite
l1t2 小时前
DeepSeek总结的 DuckDB 2.0 文档新内容
服务器·网络·数据库
IvorySQL3 小时前
PostgreSQL 日报| PG19 主备切换挂起修复(10 月 17 日)
数据库·postgresql
roman_日积跬步-终至千里3 小时前
【数据Agent论文·查询与语义|11】EntSQL:给了业务文档,模型为何还是写不对SQL?
数据库·人工智能·sql·数据分析
2601_962885723 小时前
如何用 Python 算最大回撤和回撤恢复期?
java·数据库·python
zcn1263 小时前
Left join+or exists+like关联优化
数据库·sql优化改写