全文索引与正常索引相结合

时间:2016-08-17 09:23:57

标签: mysql sql database-design

在我的数据库中,我有一个包含companyId的表,指向公司,以及一些文本。我想做一个FULLTEXT搜索,但因为我总是向特定的公司发出请求。我想使用一个结合了我的companyId和全文索引的复合键。 反正有吗?我猜这是不可能的,创建索引的最佳方法是什么,以便以下查询最快?

请求将始终为

SELECT * FROM textTable 
WHERE companyId = ? (Possibly more conditions) AND 
  MATCH(value) AGAINST("example")

我应该在整数列上正常创建索引并添加一个全文索引吗?或者我应该在索引中包含value列?也许两者都是?

3 个答案:

答案 0 :(得分:0)

为什么选择一切?这不会有助于您的查询性能。 您必须只选择所需的列。这将减少扫描表格所花费的时间。

对于FULLTEXT搜索,您的方法将按相关性对结果进行排序,然后根据WHERE子句使用索引查找。因此,您需要通过在SELECT子句中添加索引查找将其恢复为直接查找。

查询应该是这样的:

 SELECT 
    MATCH(value) AGAINST("example")
 FROM 
    textTable   

您可以根据WHERE子句添加更多过滤,或者如果您愿意,可以更好地使用IF语句或CASE或任何其他功能。

类似的东西:

 SELECT 
    IF(MATCH(value) AGAINST("example"), 'Your Returned value if TRUE', 'Your returned value if FALSE')
 FROM textTable

这将进行全表扫描,这更快。

对于索引部分, 您可以在companyId上使用索引并使用它包含值。您可以对在SELECT,WHERE和ORDER BY中使用的任何其他列执行相同的操作。

答案 1 :(得分:0)

根据文本字段的大小,MySQL会将数据存储到磁盘,因此将其包含在复合索引中不会带来多大好处。在这种情况下,索引应该简单地是companyId,它将具有对PK的引用,该PK随后将解析每个文本字段。

一般的经验法则是尽早过滤,因此最好先使用companyId(int-4个字节)进行过滤。现在,如果文本字段足够小,则可以将其添加为索引中的第二个值,以防止第二次往返,但是请理解,这将显着影响INSERT的效果。

对于这种情况,最好的选择是如果文本字段很大,则使用NoSQL数据库来处理文本查找。在这类工作中,它们是非常出色的。

答案 2 :(得分:0)

有时候可以创建更多索引,每个索引都针对特定任务。