如何防止SQL注入式非法删除_使用预处理语句绑定参数.txt
key表示实际选用的索引名,仅说明“选了哪个索引”而非“用得对”;rows是优化器预估扫描行数,反映索引过滤效率,值接近全表行数常意味索引失效。EXPLAIN 看懂 key 和 rows 的真实含义MySQL 不会直接告诉你“这个索引花了多少毫秒”,而是通过 EXPLAIN 暴露执行计划里的关键线索。key 字段显示实际用到的索引名,但很多人误以为只要非 NULL 就代表高效——其实它只说明“选了哪个索引”,不等于“用得对”。rows 是优化器预估的扫描行数,不是返回行数,也不是磁盘 IO 次数,但它最能反映索引过滤效率。常见错误现象:rows 接近全表行数,但 key 显示用了索引,说明索引区分度极低(比如在 is_deleted TINYINT 上建索引),或者查询条件没触发最左前缀(WHERE status = ? AND created_at > ? 却只在 (created_at) 上建索引)。用 EXPLAIN FORMAT=JSON 查看 filtered 字段,它表示该条件下行被保留的概率(0–100),低于 10 常意味着索引失效风险高type 为 range 或 ref 通常合理;ALL 或 index 要警惕,尤其当 rows 过大时避免在 WHERE 中对索引字段做函数操作,如 WHERE YEAR(created_at) = 2024 会让 created_at 索引完全失效用 sys.schema_index_statistics 查真实索引使用频次优化器预估可能严重偏离实际。有些索引常年没人用,却拖慢写入性能;有些查询明明走了索引,但因回表开销大,整体反而更慢。MySQL 8.0+ 的 sys 库提供了运行时统计视角。使用场景:上线后想确认某条慢查询是否真靠索引提速了,或清理长期闲置的冗余索引。查某个索引被用了多少次:SELECT * FROM sys.schema_index_statistics WHERE table_name = 'orders' AND index_name = 'idx_user_id_status'注意 reads 是逻辑读次数,不是物理 IO;如果 reads 极低但 select_latency 很高,大概率是回表或排序导致瓶颈该视图不记录历史,重启 MySQL 后归零;若需长期追踪,得配合定期快照或开启 Performance Schema 的 events_statements_history_longoptimizer_trace 揭露为什么没选你期待的索引当你写了索引、EXPLAIN 却显示 key: NULL,别急着改 SQL——先打开优化器追踪,看它到底评估了哪些索引、成本怎么算的。这是定位“索引被忽略”类问题的唯一可靠方式。 There’s An AI For That 全球领先的 AI 聚合器,收集10,225个AI工具,可用于超过2,548个任务。
