MySQL 中 FIND_IN_SET 使用和性能

FIND_IN_SET 函数使用

MySQL 中有个 FIND_IN_SET 函数,通常可以如下这么使用,这样可以直接用于查找 VARCHAR 字段中的值,比如字段 category 值为 “1,2,3” 可以通过 FIND_IN_SET(1, category) 来查找是否包含1。

MySQL这样使用:

SELECT COUNT(*) FROM user WHERE FIND_IN_SET(65, category)

和JOIN对比性能如何

数据表设计的时候使用一个字段来存储多对多关系,比如表 user 中有一个字段叫 category, category存储的是 “1,3,9” 这样的类型的数据,实际上是 category 的 id 用逗号分隔开来的。
向 user 表录入 100万的数据,同时建立 user_category 表,每个user有 3 个分类,那么category表里有300万条记录。

现在比较一下在百万级的数据量上使用 join 链接外键查询和find_in_set查询的性能

① 使用 find_in_set 查询,平均时间在2.2秒左右
② 使用left join , 使用了右表中的索引,平均时间在0.2秒左右

上述结构在执行SQL的时候都是使用了 SQL_NO_CACHE 避免了缓存,MySQL官方在 FIND_IN_SET 中说明在实际使用中数据库引擎对其做了很大程度优化,性能应该会更好一些。

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 2

请问文章里面的MySQL版本是多少呢?会不会版本不同性能会有所差异?

1年前 评论

leftjoin如果不命中索引,将是灾难,特别数据量大的情况

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!