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不走索引,无法提高效率。是这样么?!

解决方案 »

  1.   

    说的不一定正确索引主要两类:
    1 基于树的,访问索引时,判断是否需要继续访问某个节点的时候,需要比较大小。所以,这类索引对等于大于小于,以及LIKE 'XXX%'之类有效果
    2 基于散列的,无论是否用正则,都只能用精确值,对等于,不等于之类有效查询分析的时候,只要看到REGEXP或者函数之类,数据库一律认为无法索引,因为这个可能性太多了,即使REGEXP '^ABC$',分析器也不可能花费时间去解析相关的正则、函数体,否则代价还不如不用索引
      

  2.   

    REGEXP当然不走索引。 如果这样,你应该使用 like 2% or like 5% ..
      

  3.   

    索引要求有精确的键值匹配,必须是可排序的。你想想符合REGEXP的值是否满足这些条件。