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)
4

2 に答える 2

2

col1 にインデックスがあり、次のLIKEように追加する場合:

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

あなたはもう少しスピードを上げるべきです。

(col1、col2)のインデックスを作成して、mysqlにそのテーブルのコピーをメモリに保存させることもできます

于 2012-07-05T05:39:44.803 に答える
0

常に同じである場合は、RegExを事前に計算した3番目の行を作成することで、このクエリを高速化できます。

MySQLは関数ベースのインデックスをサポートしていないようです。

于 2012-07-05T05:36:29.913 に答える