通过索引查询慢速搜索LIKE%MYSQL

时间:2012-10-05 11:51:28

标签: mysql performance indexing sql-like

我有100万行这么大的表。 表的结构

id         int          INDEX(not primary not unique just index)
lang_index varchar(5)   INDEX
name       varchar(255) INDEX
enam       varchar(255) INDEX

确定。我查询

1查询

"SELECT name FROM table WHERE lang_index='en' AND name LIKE 'myname%'"

这张大桌的速度还可以。大约0.02秒。

我试试 2查询

"SELECT name FROM table WHERE lang_index='en' AND (name LIKE 'myname%' OR enam LIKE 'myname%')"

在230秒左右非常慢!!!

然后我试试这个 3查询

"SELECT name FROM table WHERE lang_index='en' AND enam LIKE 'myname%'"

速度太棒了。大约0.02秒。

然后我更快地将我的第二个查询分解为两个查询(1和3查询)。大约0.04秒但不简单。

为什么我的查询很慢?两个查询比一个查询快得多。 我需要这样做"SELECT name FROM table WHERE lang_index='en' AND (name LIKE 'myname%' OR enam LIKE 'myname%')" 我怎样才能让它更快?

1 个答案:

答案 0 :(得分:4)

OR关键字让MySQL的优化器变得疯狂。

您可以尝试这样的事情。

SELECT name FROM table WHERE lang_index='en' AND name LIKE 'myname%'
UNION
SELECT name FROM table WHERE lang_index='en' AND enam LIKE 'myname%'

或者您可以考虑使用FULLTEXT进行搜索(如果您的表格中有MyISAM用于访问)。

修改* 很难确切知道这些优化事情究竟发生了什么。你能试试吗?这将看出语言选择是否会使你犯规。

 SELECT name 
   FROM table 
  WHERE (name LIKE 'myname%' OR enam LIKE 'myname%')

你能试试吗?

SELECT name FROM table WHERE lang_index='en' AND name LIKE 'myname%'
UNION ALL
SELECT name FROM table WHERE lang_index='en' AND enam LIKE 'myname%'

它不会给出完美的结果 - 它会有重复的名称项 - 但它会跳过查询中的DISTINCT重复数据删除步骤。

您也可以试试这个。

SELECT name 
  FROM table
 WHERE lang_index='en'
   AND id IN (
    SELECT id from table 
     WHERE (name LIKE 'myname%' OR enam LIKE 'myname%'))