roo*_*ubu 17 mysql database performance processing-efficiency
从具有实际经验的任何人那里,如果字段具有普通的INDEX,LIKE查询在数百万行表中如何在速度和效率方面执行?
对数百万行表执行数据库字段搜索是否有更好的替代方法(不会过滤结果,如FULLTEXT 50%规则)?
例:
Schema (comments table)
id (PRIMARY) title(INDEX) content time stamp
Query
SELECT * FROM 'comments' WHERE 'title' LIKE '%query%'
Run Code Online (Sandbox Code Playgroud)
Eri*_* J. 15
如果您%在模式的开头有一个,那么LIKE将进行全表扫描.
您可以在布尔(而不是自然语言)模式下使用FULLTEXT来避免50%规则.
布尔全文搜索具有以下特征:
他们不使用50%的门槛.
http://dev.mysql.com/doc/refman/5.0/en/fulltext-boolean.html
任何有实际经验的人,如果字段有一个普通的INDEX,LIKE查询在数百万行表中如何在速度和效率方面表现如何?
不太好(我想我在900k的范围内进行了一些搜索,不能说我有数百万行的经验).
通常您应该以任何方式限制搜索,但这取决于表结构和应用程序用例.
此外,在某些Web用例中,可以使用一些技巧来实际改善性能和用户体验,例如索引单独的关键字并创建关键字表和rows_contains_keyword(id_keyword,id_row)表.关键字表与AJAX一起用于建议搜索术语(简单单词)并将它们编译为整数 - id_keywords.此时,查找包含这些关键字的行变得非常快.一次更新一行表也非常有效; 当然,批量更新成为一个明确的"不要".
这与全文MATCH..IN BOOLEAN MODE已经完成的不同,如果仅使用+运算符:
SELECT * FROM arts WHERE MATCH (title) AGAINST ('+MySQL +RDBMS' IN BOOLEAN MODE);
Run Code Online (Sandbox Code Playgroud)
你可能想要一个InnoDB表来做到这一点:
布尔全文搜索具有以下特征:
- 它们不会按相关性降低的顺序自动对行进行排序....
- InnoDB表需要在MATCH()表达式的所有列上使用FULLTEXT索引来执行布尔查询.即使没有FULLTEXT索引,针对MyISAM搜索索引的布尔查询也可以工作,尽管以这种方式执行的搜索会非常慢....
- 它们不使用适用于MyISAM搜索索引的50%阈值.
您能否提供有关具体案例的更多信息?
| 归档时间: |
|
| 查看次数: |
16468 次 |
| 最近记录: |