我有一张包含大约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,这太长了。
我也试过随机化限制和偏移,但我必须提前计算所有结果,所以它会更慢。
有没有办法解决这个问题?
答案 0 :(得分:1)
首先,学习如何使用EXPLAIN SELECT。这应该告诉你一些关于mysql如何为你的查询选择策略的信息。
如果只是使用first_id
和second_id
将表格减少到少量记录,它应该非常快,但它确实意味着你需要一个索引。只能使用1个索引,因此构建索引的方式取决于first_id
和second_id
的基数。如果两者仅包含有限的值(例如:低于一百),则应创建一个引用两者的索引。
但即使对于那些first_id
和second_id
值,表格中仍有大量记录,这意味着您需要在name
字段上添加索引。
常规索引对于该字段无效。您需要FULLTEXT
索引。