首页 > 解决方案 > Mysql——查询性能

问题描述

我的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%'

哪个查询会更快地选择数据?

标签: mysqlperformanceselectconcat

解决方案


每当您在表的一个或多个列上应用函数并在 WHERE 子句中使用该函数时,都不能使用索引。为了得到结果,表格将从上到下进行扫描。

您可以将其视为“计算”列。为了评估比较,数据库必须“计算”列,因此它不再是数据库中存在的静态列,而是更类似于变量。在您的情况下,您正在组合 2 列并创建一个伪列。对于计算列,不存在索引,因此数据库必须读取行数据,进行计算,然后评估比较。如果您使用查询查看查询,EXPLAIN您将看到该查询表扫描了所有 100 万行。

根据评论,您应该在 user1 上有一个索引,在 user2 上有一个索引,并且查询将是高性能的。

我不知道应用程序,但具有列名 ('user') 和迭代 (user1, user2) 的实现通常表示应该已规范化为多对多关系的重复组。

有了这样的结构,您就不会使用WHERE user1 = something OR user2 = something.


推荐阅读