为什么 Mysql 不适合大数据文本检索

1,149 阅读1分钟

首先,MySQL 本身不支持全文搜索,使用模糊查询会导致全表扫描,查询效率低下。

其次 MySQL 对于复杂条件查询的支持并不好,MySQL 最多使用一个条件涉及的索引来过滤,然后剩余的条件只能在遍历行过程中进行内存过滤。

MySQL 复杂 where 条件分析

假设有一张订单表如下,其中 id 为主键,iid 为唯一索引,user_id 为普通索引,price 无索引。

orders(id, order_id, user_id, price)

基于上表,分析如下拥有 Where 条件的 SQL 语句。

update orders set price = price * 0.8 where user_id = 102 and order_id > 'N0001' and order_id < 'N0012';

上述 SQL 语句的 Where 条件使用了两个索引,order_iduser_id。MySQL 会根据索引选择性等指标选择其中一个索引来使用,而另外一个没有被使用的 Where 条件就被当作普通的过滤条件,被用到的索引被称为 Index Key,而作为普通过滤的条件则被称为 Table Filter

所以,该 SQL 的执行过程就是依次将 Index Key 范围内的索引记录读取,然后回表读取完整数据纪录,然后返回给 MySQL 的服务层按照 Table Filter 进行过滤。

但是使用的索引是联合索引时,则还可能出现 Index Filter,利用它可以减少回表次数和返回给 MySQL 服务层的记录的数量,降低存储引擎和服务层的交互开销,提供 SQL 的执行效率。

上述这种处理复杂条件查询的方式因为只能通过一个索引进行过滤,所以需要进行大量的 I/O 操作来读取行数据,并消耗 CPU 进行内存过滤,导致查询性能的下降。

引用

为什么ElasticSearch比MySQL更适合全文索引

MySQL复杂where条件分析