求证 MySQL REGEXP 不走索引

yiwusuo 2011-09-23 08:39:48
EXPLAIN SELECT * FROM my162100.162100_area WHERE area_id REGEXP "^(2|5|11)$"; //更不用说"^(2|5|11)(_[0-9]+)*$"复杂点的了

得出:
possible_keys key rows
NULL NULL 2007(所有行)

而EXPLAIN SELECT * FROM my162100.162100_area WHERE area_id="2" OR area_id="5" OR area_id="11";

得出:
possible_keys key rows
area_id area_id 4

当然,字段area_id我设了索引

结论:REGEXP不走索引,无法提高效率。是这样么?!

...全文
959 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
iihero_ 2011-09-24
  • 打赏
  • 举报
回复
索引要求有精确的键值匹配,必须是可排序的。你想想符合REGEXP的值是否满足这些条件。
ACMAIN_CHM 2011-09-23
  • 打赏
  • 举报
回复
REGEXP当然不走索引。 如果这样,你应该使用 like 2% or like 5% ..
rucypli 2011-09-23
  • 打赏
  • 举报
回复
对 不走索引
shine333 2011-09-23
  • 打赏
  • 举报
回复
说的不一定正确

索引主要两类:
1 基于树的,访问索引时,判断是否需要继续访问某个节点的时候,需要比较大小。所以,这类索引对等于大于小于,以及LIKE 'XXX%'之类有效果
2 基于散列的,无论是否用正则,都只能用精确值,对等于,不等于之类有效

查询分析的时候,只要看到REGEXP或者函数之类,数据库一律认为无法索引,因为这个可能性太多了,即使REGEXP '^ABC$',分析器也不可能花费时间去解析相关的正则、函数体,否则代价还不如不用索引

56,679

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧