从一个巨大的表中获取随机值集

时间:2015-09-24 15:15:37

标签: mysql

我有一张包含大约10亿条记录的表格。它具有以下结构:

id | name | first_id | second_id

我还有一个包含一组特定单词的数组:

$arr = ['camel', 'toe', 'glasses', 'book'];

我现在必须从此表中获取所有记录,其中:

- name contains one or more keywords from this array
- first_id matches 8
- second_id matches 55

这些值当然是由它们组成的,它们会在我的应用程序中动态变化。

我该怎样才能做到最有效?

我尝试了以下内容:

SELECT *
FROM table t
WHERE (t.name LIKE '%camel%' OR t.name LIKE '%toe%' OR t.name LIKE '%glasses%' OR t.name LIKE '%book%') AND t.first_id = 8 AND t.second_id = 55;

但它执行约3.5秒。

我只需要从这个查询中获得大约3-4个随机记录,所以我也尝试将结果限制为300.但它仍然给了我700ms,这太长了。

我也试过随机化限制和偏移,但我必须提前计算所有结果,所以它会更慢。

有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:1)

首先,学习如何使用EXPLAIN SELECT。这应该告诉你一些关于mysql如何为你的查询选择策略的信息。

如果只是使用first_idsecond_id将表格减少到少量记录,它应该非常快,但它确实意味着你需要一个索引。只能使用1个索引,因此构建索引的方式取决于first_idsecond_id的基数。如果两者仅包含有限的值(例如:低于一百),则应创建一个引用两者的索引。

但即使对于那些first_idsecond_id值,表格中仍有大量记录,这意味着您需要在name字段上添加索引。

常规索引对于该字段无效。您需要FULLTEXT索引。