mysql - INDEX Mysql for 字符串

标签 mysql database indexing full-text-search

我有一个包含超过五百万条记录的大型数据库,这个数据库有三个字段(ID,名称,文本),字段ID有一个主键,字段name 有一个 FULLTEXT 索引。

我想为我的网站创建一个搜索引擎,在 name 字段中搜索,我使用 FULLTEXT 索引,但缺点是不接受小于以下的关键字四个字符,所以我决定删除它并在字段 name 上放置一个 INDEX KEY 并使用以下请求:

EXPLAIN SELECT * FROM table WHERE locate ('search', name) > 0;

问题是这个应用没有使用索引的KEY字段名, 但是这个请求:

EXPLAIN SELECT name FROM table WHERE locate ('search', name) > 0;

使用INDEX KEY, 我不知道为什么当我选择所有字段时MYSQL不使用索引。

在你看来如何解决这个问题,如果可能的话还有更好的选择。

最佳答案

可以在mysql配置中设置全文索引的最小字符数。我现在不在我的电脑前寻找示例,但是此页面可能对您有所帮助:http://dev.mysql.com/doc/refman/5.1/en/fulltext-fine-tuning.html

更新:

回到我的电脑。那么关于mysql为什么要在SELECT name FROM table WHERE locate ('search', name) > 0;语句上使用索引就很简单了。当您在名称字段上创建索引时,索引包含实际的名称字段,即名称字段的值,因此当您仅选择名称字段时,mysql 可以进行搜索并从索引中检索所需的所有数据。所以在这种情况下,mysql 必须执行一个操作来检索与索引中搜索到的值匹配的数据并返回它们。

SELECT name FROM table WHERE locate ('search', name) > 0; 但是还需要其他数据字段。由于只有名称字段的值存储在索引中,mysql 必须先读取索引,然后再读取表来检索其他字段。所以在这种情况下,mysql 必须匹配索引中的值,然后在表中找到值,然后返回它们。这意味着 mysql 必须执行 2 个操作,与之前的场景相比,工作量增加了一倍。

由于 500 万行仍然很小,因此 mysql 循环遍历表并检索行可能更快。当您添加更多行时,一旦循环遍历表的成本高于读取索引然后在表中查找值的成本,mysql 可能会开始使用索引。

希望这是有道理的。

关于mysql - INDEX Mysql for 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11948457/

相关文章:

sql - 数据库索引: why pairing

python - 如何正确扩展 Pandas 数据框?

mysql - mysql中的join条件需要忽略null字段

php - ADOdb 和预览准备好的语句 (PHP)

mysql - 具有相同数据的 SQL 中的最大计数 (*) 错误

node.js - Sequelize 'Inverse' 关系

php - 极其简单的表格还需要自己的模型类吗?

sql - PostgreSql - 唯一行,独立于顺序

python - 使用特定值初始化特定形状的numpy数组

mysql - 我可以同时使用replicate-ignore-db 和replicate-do-table 吗?