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 有值 → 使用了某个索引
  • keyNULL没有使用索引(走全表扫描)

例子

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 BYGROUP BY 等操作。

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

  • 缺点

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

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

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

总结

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

相关推荐
张洛闻Eren1 天前
MySQL 维护稳定系统【MySQL第二课】
linux·数据库·mysql·云原生
布莱克6051 天前
理解索引:从概念到实践
数据库·mysql
我不是疯子是傻子1 天前
Qt CAN通信周期发送抖动?实测定时器精度校准与时间戳补偿方案
开发语言·数据库·qt
这个DBA有点耶1 天前
数据库迁移怎么做到“零翻车“:金仓 KDMS/KDTS/KFS 工具链实测
数据库·架构·dba
2501_937860941 天前
MySQL联合查询(多表查询)
数据库·mysql
名字还没想好☜1 天前
Next.js 用 Server Components 直连数据库:去掉 API 层的边界,和三条别踩的安全红线
前端·javascript·数据库·安全·react·next.js
迷迭香yy1 天前
行业板块轮动因子实战从板块资金到因子建模的本地化Python全流程
数据库·人工智能·python
SelectDB1 天前
抖音集团 实时数据仓库:Apache Doris / SelectDB 的技术能力与实践
数据库
SelectDB1 天前
网易 日志与时序数据分析:Apache Doris / SelectDB 的技术能力与实践
数据库
weixin_539446781 天前
Navicat Premium 17报缺少ODBC驱动
数据库