mysql你大概误以为走索引的慢查询sql

饭宝  论坛元老 | 2024-10-16 06:51:34 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1652|帖子 1652|积分 4956

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
有时间,开发人员或数据库管理员大概会假设他们的SQL查询将使用索引来进步性能,但现实上由于某些缘故原由,查询并未使用索引。下面是一些常见情况,这些情况大概导致SQL查询没有如预期那样使用索引:
1. 使用了函数或计算

如果在索引列上使用了函数或任何计算,那么纵然该列上有索引,查询也大概不会使用该索引。
  1. SELECT * FROM users WHERE YEAR(birthdate) = 1990;
复制代码
在这个例子中,纵然 birthdate 列上有索引,YEAR() 函数的使用也大概制止了索引的使用。
2. 使用了类型不匹配的比较

数据类型不匹配也会导致索引失效。
  1. SELECT * FROM orders WHERE customer_id = '123'; -- 假设 customer_id 是 INT 类型
复制代码
纵然 customer_id 列上有索引,将整数与字符串举行比较也大概导致不使用索引。
3. 使用了前导模糊查询

在使用 LIKE 操纵符举行模糊查询时,如果模式的开始部分包罗了通配符,索引将不会被使用。
  1. SELECT * FROM products WHERE name LIKE '%iPhone%';
复制代码
这里,纵然 name 列上有索引,但是因为 LIKE 查询以 % 开头,索引大概不会被使用。
4. 复合索引未按次序使用

在复合索引中,如果查询没有遵循索引列的次序,那么索引大概不会被有效地使用。
  1. -- 假设有一个索引是 (first_name, last_name)
  2. SELECT * FROM users WHERE last_name = 'Smith';
复制代码
在这个例子中,查询仅使用了复合索引的第二个列,大概导致索引不被使用,或者不被有效使用。
5. 使用了 OR 条件

在某些情况下,使用 OR 条件大概会导致索引不被使用,尤其是当 OR 条件毗连的列不都有索引时。
  1. SELECT * FROM users WHERE last_name = 'Smith' OR age = 25;
复制代码
如果 last_name 和 age 列不都有索引,这个查询大概不会使用索引。
6. 索引列包罗 NULL 值

某些数据库系统中,如果索引列包罗大量的 NULL 值,查询大概不会使用该索引。
  1. SELECT * FROM users WHERE profile_picture IS NULL;
复制代码
如果有很多用户没有 profile_picture,那么纵然这列上有索引,查询也大概不会使用索引。
7. 选择性不高的列

如果索引列的选择性(唯一值的比例)非常低,查询优化器大概会决定不使用索引,因为扫描全表大概更高效。
  1. SELECT * FROM users WHERE gender = 'M';
复制代码
如果 gender 列的值非常倾斜(例如,分布在 'M' 和 'F' 之间),那么这个查询大概不会使用索引。
怎样验证查询是否使用索引

为了验证查询是否现实上使用了索引,可以在执行查询前使用 EXPLAIN(在某些数据库中大概是 EXPLAIN PLAN)来查看查询的执行筹划。
  1. EXPLAIN SELECT * FROM users WHERE last_name = 'Smith';
复制代码
执行筹划将告诉你是否有索引被使用,以及查询是怎样执行的。基于这些信息,你可以调解查询或索引策略以优化性能。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

饭宝

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表