2012-07-05 80 views
1
mysql> EXPLAIN SELECT col1, col2 FROM t WHERE col1 REGEXP '^foobar_[0-9]{4}$'; 
+----+-------------+---------------+------+---------------+------+---------+------+--------+-------------+ 
| id | select_type | table   | type | possible_keys | key | key_len | ref | rows | Extra  | 
+----+-------------+---------------+------+---------------+------+---------+------+--------+-------------+ 
| 1 | SIMPLE  |  t  | ALL | NULL   | NULL | NULL | NULL | 757000 | Using where | 
+----+-------------+---------------+------+---------------+------+---------+------+--------+-------------+ 
1 row in set (0.15 sec) 

mysql> DESCRIBE t; 
+------------------------+------------------------+------+-----+---------+-------+ 
| Field     | Type     | Null | Key | Default | Extra | 
+------------------------+------------------------+------+-----+---------+-------+ 
| col2     | varchar(255)   | NO | MUL | {}  |  | 
| col1     | varbinary(255)   | NO | PRI |   |  | 
+------------------------+------------------------+------+-----+---------+-------+ 
2 rows in set (0.22 sec) 
+0

你可以嘗試添加一個索引COL1。但是我不確定mysql是否可以在列上執行正則表達式時使用索引。 – Namphibian

+0

col1已經被索引... – golja

+0

不是'PRI'已經是一種索引嗎? – qazwsx

回答

2

,如果你有一個COL1指數,並添加LIKE這樣的:

SELECT col1, col2 
FROM t 
WHERE col1 LIKE 'foobar_%' AND col1 REGEXP '^foobar_[0-9]{4}$'; 

你應該得到升技更快的速度。

還可以使(COL1,COL2)的指數,以使MySQL商店表的副本中memeory

+0

LIKE +索引:http:// dev .mysql.com/DOC/refman/5.6/EN /索引二叉樹的hash.html – biziclop

0

您可以通過創建第三行來加速此查詢,如果它的總是相同,那麼您已經預先計算了RegEx。

MySQL似乎並不支持function based indexes