Mysql - 查询性能

标签 mysql performance select concatenation

我的 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/

相关文章:

ruby - 在 Rails 中使 TimeWithZone 对象变得惰性

python - 具有上限/下限的 Numpy 自定义 Cumsum 函数?

sql-server - 选择(无锁定)

MySQL 表组织和优化 (Rails)

mysql order by 不包括0

mysql 查询显示 #1064 - 你的 SQL 语法有错误;

mysql - 函数 SUM 在 MYSQL 中没有按预期工作

MySQL 社区版

python - 使用 Python 代码并行计算两点之间距离的最快方法

sql - 在 SQL Server 中执行嵌套 case 语句逻辑的最佳方法