在我的数据库中,我有一个包含companyId的表,指向公司,以及一些文本。我想做一个FULLTEXT搜索,但因为我总是向特定的公司发出请求。我想使用一个结合了我的companyId和全文索引的复合键。 反正有吗?我猜这是不可能的,创建索引的最佳方法是什么,以便以下查询最快?
请求将始终为
SELECT * FROM textTable
WHERE companyId = ? (Possibly more conditions) AND
MATCH(value) AGAINST("example")
我应该在整数列上正常创建索引并添加一个全文索引吗?或者我应该在索引中包含value
列?也许两者都是?
答案 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)
有时候可以创建更多索引,每个索引都针对特定任务。