5

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

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 Query

"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%')" 怎样才能让它更快?

4

1 回答 1

5

关键字使ORMySQL 的优化器发疯。

你可能会尝试这样的事情。

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 或 MySQL 5.6 或更高版本。

编辑* 很难确切地知道这些优化的事情是怎么回事。你能试试这个吗?这将查看语言选择是否让您感到困惑。

 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%'))
于 2012-10-05T12:49:24.730 回答