MySQL全文索引FULLTEXT对精确查询不命中问题
在学习explain的关于in会不会影响索引命中时发现如果你MySQL中索引列设置成全文索引FULLTEXT就不会命中索引换成普通的索引之后就能命中。deepseek说全文索引 (FULLTEXT) 是为 关键词搜索 设计的。而是 精确匹配必须走 B-Tree 索引EXPLAIN SELECT * FROM contract_tbl WHERE contno 11111111;之后我按照建议将contno的索引改成了普通索引发现普通索引使用in来做查询的时候如果只in一个数据索引还能命中但是如果contno in两个数据就又出现了索引没命中的情况。EXPLAIN SELECT * FROM contract_tbl WHERE contno IN(11111111,11111112);问了deepseek说in一个就会直接走普通索引但是如果你in两个就会触发MySQL的优化器成本评估。查询是SELECT *需要返回所有字段。索引idx_contno只包含contno字段当通过索引找到contno后还需要回表根据主键去聚簇索引读取整行数据。当IN只有1 个值时回表次数很少比如 1 行或几行成本低所以优化器选择索引。当IN有2 个值时假设这两个值匹配的行数较多比如总共超过表总行数的 20%~30%那么回表需要大量的随机 I/O优化器认为还不如直接全表扫描顺序读来得快因此放弃索引选择ALL。后面我进行了实验之前只有两条数据我将数据增加到10条这样in两个数据时没有超过总行数的20%索引确实又命中了。当我in三个数据的时候又出现了索引没命中走了全表查询的情况。但我发现主键索引不会有这样的情况因为主键索引不会有回表的开销所以就能直接走索引不过如果in的数据大于临界值还是会导致查全表的情况这个和优化器有关。结论能不用in就别用。

相关新闻

最新新闻

日新闻

周新闻

月新闻