MySQL插入新行时是否总会执行全表扫描?
MySQL插入新行时是否总会执行全表扫描?
结论先行:MySQL插入新行时并不会执行全表扫描,你看到的执行计划里access_type: "ALL"属于容易误导的显示,并非实际执行了全表扫描。
关于你的疑问点:
- 你认为“新插入内容用不到索引”是错误的——插入操作不仅不会跳过索引,反而需要维护索引:比如主键索引会将新行按顺序插入到B+树对应位置,唯一索引会检查是否存在冲突,这些操作都不需要扫描整张表。
- 执行计划里的
access_type: "ALL"是EXPLAIN工具对INSERT语句的特殊默认标识,因为EXPLAIN原本是为SELECT类查询设计的,对INSERT的执行细节展示并不精准,这个字段不能代表插入过程真的做了全表扫描。
你提供的执行计划代码:
{ "query_block": { "select_id": 1, "table": { "insert": true, "table_name": "my_table", "access_type": "ALL" } } }
简单总结:插入操作的核心是写入数据+维护索引,全程不需要全表扫描,执行计划里的access_type: "ALL"只是工具显示的特殊值,和实际执行逻辑无关。
内容的提问来源于stack exchange,提问作者avi
相关产品推荐
相关产品推荐

