我的 mysql 表中没有数据,所以我无法检查哪个 sql 语句会更快。
我有一个包含列的表:ID |用户1 |用户2 | 表将有大约 100 万条记录,我需要从 user1 或 user2 列中选择 id_user (int)。
第一个查询:
SELECT `id`, `data` FROM `table` WHERE `user1` = :id_user OR `user2` = :id_user
或第二个查询:
SELECT `id`, `data` FROM `table` WHERE concat(user1, '/' user2) LIKE '%:id_user%'
哪个查询会更快地选择数据?
最佳答案
任何时候在表的一个或多个列上应用函数并在 WHERE 子句中使用它时,都不能使用索引。为了得到结果,表格将被从上到下扫描。
您可以将其视为“计算”列。为了评估比较,数据库必须“计算”该列,因此它不再是数据库中存在的静态列,而是更类似于一个变量。在您的例子中,您正在组合 2 列并创建一个伪列。对于计算列,不存在索引,因此数据库必须读取行数据,进行计算,然后进行比较。如果您使用 EXPLAIN
查看查询,您会看到此查询表扫描了所有 100 万行。
根据评论,您应该在 user1 上有一个索引,在 user2 上有一个索引,查询将具有高性能。
我不知道该应用程序,但具有列名(“用户”)和迭代(用户 1、用户 2)的实现通常表示应该已规范化为多对多关系的重复组。
有了这样的结构,您就不会使用 WHERE user1 = something OR user2 = something
进行查询。
关于Mysql - 查询性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53949181/