当前位置: 首页 > news >正文

MySQL知识点3

MySQL中建索引时注意事项

  1. 避免过度索引
    索引会占用存储空间,且会降低INSERT、UPDATE、DELETE等写操作的性能(因为索引需要同步更新)。通常只为常用于查询条件(WHERE)、排序(ORDER BY)、连接(JOIN)的字段创建索引。

  2. 选择合适的字段建立索引

    • 优先为区分度高的字段建立索引(如身份证号),区分度低的字段(如性别)不适合建索引。
    • 避免为频繁更新的字段建索引,因为索引维护成本高。
    • 长字符串建议使用前缀索引(如INDEX idx_name (name(10))),平衡索引大小和查询效率。
  3. 注意联合索引的顺序
    联合索引遵循“最左前缀匹配原则”,应将查询中最常作为条件、区分度高的字段放在前面。例如,(a, b, c)的索引能匹配aa AND ba AND b AND c的查询,但无法直接匹配bb AND c的查询。

  4. 避免索引失效场景

    • 索引字段参与计算或函数操作(如WHERE YEAR(create_time) = 2023)。
    • 使用NOT IN!=<>IS NOT NULL等可能导致全表扫描。
    • 字符串不加引号(如WHERE name = 123会导致类型转换,索引失效)。
    • 使用OR连接包含非索引字段的条件。
  5. 考虑索引类型选择

    • InnoDB默认使用B+树索引,适用于范围查询和排序。
    • 哈希索引适用于精确匹配(如=),但不支持范围查询和排序,Memory引擎支持。
    • 空间索引用于地理数据类型,全文索引用于文本内容的模糊查询(替代低效的LIKE '%...%')。
  6. 定期维护索引

    • 通过EXPLAIN分析查询计划,检查索引是否被有效使用。
    • 表数据大量删除后,使用OPTIMIZE TABLE重建索引,减少碎片。
    • 监控索引使用情况,删除长期未使用的冗余索引(可通过sys.schema_unused_indexes视图查询)。
  7. 特殊场景处理

    • 小表(数据量少)无需建索引,全表扫描可能更快。
    • 临时表或频繁重建的表,索引收益可能低于维护成本。
    • 避免对NULL值较多的字段建索引,效果有限。

MySQL中的回表是什么?

在MySQL中,回表是指当使用非聚簇索引(二级索引)查询数据时,若索引本身不包含查询所需的全部字段,需要通过索引叶子节点中存储的主键值,再次访问聚簇索引(主键索引)以获取完整数据的过程。

具体过程:

  1. 非聚簇索引结构:二级索引的叶子节点仅存储索引字段值和对应的主键值,不包含整行数据。
  2. 查询触发回表:当查询的字段超出二级索引包含的范围时,数据库会先通过二级索引找到匹配记录的主键,再用主键去聚簇索引中查询完整行数据。

示例:

假设有表user(id, name, age)id是主键(聚簇索引),name是二级索引。
执行SELECT id, name, age FROM user WHERE name = '张三'时:

  • 先通过name的二级索引找到'张三'对应的主键id=10
  • 再通过主键id=10查询聚簇索引,获取age字段的值,完成整个查询。

MySQL中使用索引一定有效吗?如何排查索引效果?

在MySQL中,使用索引不一定总能提升性能,甚至在某些情况下可能导致性能下降。索引的有效性取决于查询场景、数据分布、索引设计等多种因素。

一、索引无效或效果不佳的常见情况

  1. 数据量过小的表
    对于行数极少的表(如几百行),全表扫描的速度可能比走索引更快(索引本身也有IO开销)。

  2. 索引选择性过低
    当索引字段的区分度低(如“性别”字段只有男/女两个值),MySQL可能会判断全表扫描比走索引更高效。

  3. 索引失效场景
    如索引字段参与函数运算、使用OR连接非索引字段、使用NOT IN/!=等操作,可能导致索引失效(详见之前提到的“索引失效场景”)。

  4. 大量数据更新场景
    频繁的INSERT/UPDATE/DELETE会导致索引频繁维护,反而拖慢写操作性能。

  5. 联合索引顺序不合理
    未遵循“最左前缀原则”,导致查询无法命中联合索引的有效部分。

二、如何排查索引效果?

1. 使用EXPLAIN分析查询计划

EXPLAIN是排查索引效果的核心工具,通过它可以查看MySQL如何执行查询、是否使用索引、使用了哪个索引等。

用法:在SQL语句前加EXPLAIN,例如:

EXPLAIN SELECT * FROM user WHERE name = '张三';

关键字段解读

  • type:表示连接类型,性能从好到差依次为system > const > eq_ref > ref > range > index > ALL
    • ALL表示全表扫描(未使用索引),需优化;
    • range/ref等表示使用了索引。
  • key:实际使用的索引名称,若为NULL则未使用索引。
  • rows:MySQL估计需要扫描的行数,值越小越好。
  • Extra:额外信息,如Using index表示使用了覆盖索引(无需回表);Using filesort表示需要额外排序(可能未用到索引排序);Using where; Using index表示索引有效且覆盖查询。
2. 查看索引使用情况

通过系统视图监控索引是否被实际使用,避免冗余索引:

-- 查看未使用过的索引(需开启performance_schema)
SELECT OBJECT_SCHEMA AS 数据库名,OBJECT_NAME AS 表名,INDEX_NAME AS 索引名
FROM performance_schema.table_io_waits_summary_by_index_usage
WHERE INDEX_NAME IS NOT NULL AND COUNT_STAR = 0AND OBJECT_SCHEMA NOT IN ('mysql', 'sys', 'information_schema', 'performance_schema');
3. 对比执行时间

通过SELECT @@profiling = 1;开启 profiling,或直接对比加索引前后的查询耗时:

-- 开启 profiling
SET profiling = 1;-- 执行查询
SELECT * FROM user WHERE name = '张三';-- 查看执行时间
SHOW PROFILES;
4. 分析数据分布

使用ANALYZE TABLE更新表的统计信息,帮助MySQL生成更合理的执行计划:

ANALYZE TABLE user;

若数据分布极端(如某字段90%的值都是“1”),即使有索引,MySQL也可能选择全表扫描。


文章转载自:

http://u8Qt34bL.nkkpp.cn
http://5WKi7JxJ.nkkpp.cn
http://7APRGLns.nkkpp.cn
http://zMu42eOl.nkkpp.cn
http://HtHituNu.nkkpp.cn
http://iAdgce0d.nkkpp.cn
http://450gSAxF.nkkpp.cn
http://OpNVp5Pn.nkkpp.cn
http://Gfqk9XBi.nkkpp.cn
http://jwugnAx8.nkkpp.cn
http://bTUA6eV1.nkkpp.cn
http://qof0eBOG.nkkpp.cn
http://5wA8F6LE.nkkpp.cn
http://2J9jMlPa.nkkpp.cn
http://ToWkwVYt.nkkpp.cn
http://GB3kWvST.nkkpp.cn
http://wloMJAGg.nkkpp.cn
http://8FIipg4i.nkkpp.cn
http://6hzgkDDG.nkkpp.cn
http://SD3jz6NP.nkkpp.cn
http://LmzoyuP5.nkkpp.cn
http://4L3ZnfqA.nkkpp.cn
http://Sk5BrdEh.nkkpp.cn
http://M9NvAolq.nkkpp.cn
http://1lAG22Ia.nkkpp.cn
http://A5RNsYAo.nkkpp.cn
http://Qb5r3cBT.nkkpp.cn
http://H5O9eeXc.nkkpp.cn
http://skZf6Afi.nkkpp.cn
http://gBvMlmhv.nkkpp.cn
http://www.dtcms.com/a/364255.html

相关文章:

  • 电子病历空缺句的语言学特征描述与自动分类探析(以GPT-5为例)(中)
  • Cookie、Session、登录
  • 空调噪音不穿帮,声网虚拟直播降噪技巧超实用
  • 【论文阅读】-《THE JPEG STILL PICTURE COMPRESSION STANDARD》
  • 【论文阅读】LightThinker: Thinking Step-by-Step Compression (EMNLP 2025)
  • 自然语言处理深层语义分析中公理化体系的可行性、挑战与前沿进展
  • 华为HCIP、HCIE认证:自学与培训班的抉择
  • 《探索C++11:现代语法的性能优化策略(中篇)》
  • 分布式系统的 CAP 原则与 BASE 原则理解
  • 精密板料矫平机:让金属“心平气和”的科技
  • 多场景对练数据的 Excel 横向导出方案(EasyExcel 动态表头实践)
  • Django REST Framework Serializer 进阶教程
  • 少儿舞蹈小程序(6)打造您的“活”名片:动态展示机构实力
  • lesson53:CSS五种定位方式全解析:从基础到实战应用
  • 20250901 搜索总结
  • C语言中的运算符
  • vue3 使用css变量
  • CSS Sass Less 样式.xxx讲解
  • 代码随想录算法训练营第四天|链表part02
  • Windows 10/11 系统 vcruntime140.dll 故障终极解决:从重装组件到系统修复的完整流程
  • 飞算JavaAI真能帮小白搞定在线图书借阅系统?开发效果大揭秘!
  • shell中命令小工具:cut、sort、uniq,tr的使用方式
  • 电子电气架构 --- 新EEA架构下开发模式转变
  • Redis基础概述
  • 分词器详解(一)
  • 第二十章 ESP32S3 IIC_EEPROM 实验
  • STM32 - Embedded IDE - GCC - 使用 GCC 链接脚本限制 Flash 区域
  • 【Android】从复用到重绘的控件定制化方式
  • React实现音频文件上传与试听
  • 计算机毕业设计选题推荐:基于Python+Django的新能源汽车数据分析系统