- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想制作允许按特定用户搜索用户消息的系统。假设有下表
create table messages(
user_id int,
message nvarchar(500));
那么,如果我想搜索来自用户 1 的所有包含单词“foo”的消息,我应该在这里使用什么样的索引。
A.F.A.I.K.最后一个是不可能的。那么我假设我应该使用第一个选项,它会在几千个用户的情况下表现更好吗?
如果每个人都有大约 100 条消息,那么完整的迭代不会消耗太多资源?
也许我可以在消息中包含用户名并使用 BOOLEAN 全文搜索模式,但我认为这会比使用索引 user_id 慢。
最佳答案
@Alden Quimby 的回答就目前而言是正确的,但还有更多的故事,因为 MySQL 只会尝试选择最佳索引,而它做出决定的能力是有限的因为全文索引与优化器交互的方式。
实际发生的是这样的:
如果指定的 user_id 存在于表中的 0 或 1 个匹配行中,优化器将意识到这一点并选择 user_id 作为该查询的索引。快速执行。
否则,优化器将选择全文索引,过滤与全文索引匹配的每一行,以消除不包含与 WHERE 子句匹配的 user_id 的行。没那么快。
所以这并不是真正的“最佳”路径。它更像是全文,有一个很好的优化来避免在我们知道我们对表几乎没有任何兴趣的情况下进行全文搜索。
失败的原因是全文索引不会将任何有意义的统计信息返回给优化器。它只是说“是的,我认为查询可能只需要我检查 1 行”......当然,这让优化器非常满意,所以全文索引以最低成本赢得投标,除非索引具有整数值(value)也相对较低或更低。
不过,这并不意味着我不会先尝试这种方式。
还有另一种选择,它最适合全文查询 IN BOOLEAN MODE
,那就是创建另一个列,您可以用类似 CONCAT('user_id_',user_id) 或类似的东西填充它,然后声明一个 2 列的全文索引。
filter_string VARCHAR(48) # populated with CONCAT('user_id_',user_id);
....
FULLTEXT KEY (message,filter_string)
然后在查询中指定所有内容。
SELECT ...
WHERE user_id = 500 AND
MATCH (message,filter_string) AGAINST ('+kittens +puppies +user_id_500' IN BOOLEAN MODE);
现在,全文索引将负责仅匹配那些在两列的组合全文索引中出现 kittens、puppies 和“user_id_500”的行,但您仍然希望在那里也有整数过滤器尽管消息中随机出现“user_id_500”,请确保最终结果受到约束。
关于mysql - MySQL 中的复合 FULLTEXT 索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18949633/
MySQL 文档给出了创建全文索引的格式: | {FULLTEXT|SPATIAL} [INDEX|KEY] [index_name] (index_col_name,...) [index_opti
我有一个搜索程序,它必须在五个表中搜索相同的字符串。我想知道哪个在读取性能方面更好? 要将所有表合并到一个表中,然后在其上添加全文索引 在所有这些表中创建全文索引并对所有表发出查询,然后合并结果 最佳
现在在 vBulletin board 上工作,它运行在带有 InnoDB 表引擎的 MySQL 5.6.21 上。 vBulletin 中有一个默认的查询,它在一列上使用索引提示,同时在另外两列上使
假设我们在文本中有“ABCD1234EF”这个词。现在要找到它,我必须匹配确切的词。目标是通过“ABCD1234EF”、“ABCD”、“1234”或“EF”字符串找到它。不是“CD12”或类似的东西。
我想运行 FULLTEXT 搜索并仅返回具有不同(唯一)product_name 的结果,但 DISTINCT(product_name) 似乎不适用。任何正确方向的帮助或指示都会受到极大的欢迎。 M
我向表中添加了一个 FULLTEXT 索引,如下所示: ALTER TABLE TEST ADD FULLTEXT(name, descrip, notes); TEST 表有 100 行。我用一行中
我在网站的搜索栏中使用全文。代码如下所示, 搜索.php ".$name.": ".$desc.""; } ?> 这在大多数情况下都可以正常工作。在我的数据库中,描述列下的一行显示:“1. 切
我有一个标准的 MySQL 全文查询,如下所示: 从帐户中选择 * WHERE MATCH(first_name, username) AGAINST ('stringhere') 问题是,它无法找到
我正在尝试修改这篇文章中的完整路径检索代码: http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/在嵌套集模型中使用
我有一些列的全文,例如: car normal | car super | car extra 然后是类似的值 car normal | car super | car extra normal ca
我在 MySQL 全文 搜索中遇到区分大小写的问题。 我刚刚按照 MySQL doco http://dev.mysql.com/doc/refman/5.1/en/fulltext-boolean.
我必须匹配许多字段中的文本。目前我在查询中使用了Like。但是Like给出了太多结果。我已经阅读了有关mysql FULLTEXT查询的内容,并且尝试在我的查询中应用。但我不知道它是否有效。 旧查询:
我有一个名为 keywords 的字段存储的信息是用 | 分隔的关键字 例如: sky|Banana is good|apple|apple is red|sky is blue|green 我尝试做
我有一个标准的 MySQL 全文查询,如下所示: SELECT * FROM accounts WHERE MATCH(first_name, username) AGAINST ('stringhe
我正在尝试使用 mysql FULLTEXT 进行查询,但不幸的是它返回空结果,即使表包含那些输入关键字。 表:user_skills: +----+-------------------------
如果我搜索一个词“will walk”,那么结果将显示与搜索词相似的所有条目。例如: Search Term: will walkRecords: 1. It will walk.2. tomorro
我尝试运行以下查询 SELECT * FROM complains WHERE match(title, description) against('+lorem' IN BOOLEAN MODE)
发布这个,这样我也许可以从几个小时的搜索中拯救一些其他可怜的笨蛋,或者更好的是,从 MySQL 领域比我更聪明的人那里得到更好的答案。 ;-) 当使用 FULLTEXT 索引搜索 MySQL 时,如何
我有办法获得全文搜索背后的逻辑 示例表 +----+-------------+ | id | title | +----+-------------+ | 1 | Hello Worl
下面的查询需要 1.1s 来执行,EXPLAIN 显示了 FULLTEXT 索引的使用: SELECT SQL_NO_CACHE COUNT(*) FROM e_entity WHERE meta_o
我是一名优秀的程序员,十分优秀!