mysql - 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%'
哪个查询会更快地选择数据?
解决方案
每当您在表的一个或多个列上应用函数并在 WHERE 子句中使用该函数时,都不能使用索引。为了得到结果,表格将从上到下进行扫描。
您可以将其视为“计算”列。为了评估比较,数据库必须“计算”列,因此它不再是数据库中存在的静态列,而是更类似于变量。在您的情况下,您正在组合 2 列并创建一个伪列。对于计算列,不存在索引,因此数据库必须读取行数据,进行计算,然后评估比较。如果您使用查询查看查询,EXPLAIN
您将看到该查询表扫描了所有 100 万行。
根据评论,您应该在 user1 上有一个索引,在 user2 上有一个索引,并且查询将是高性能的。
我不知道应用程序,但具有列名 ('user') 和迭代 (user1, user2) 的实现通常表示应该已规范化为多对多关系的重复组。
有了这样的结构,您就不会使用WHERE user1 = something OR user2 = something
.
推荐阅读
- c - 计算和打印矩阵的对角线之和
- javascript - 如何在 Angular 中使用 addEventListener 和 postMessage?
- php - 如何将日期、时间和值从单选按钮放入数据库
- c# - 逐个像素地动态绘制和显示,有一些延迟
- npm - 如何从 Nexus oss 代理获取依赖于 github 项目的 npm 包
- django - Django 测试 - 发送包含整数的数组数组
- android - 在 android 中使用改造登录
- json - 我如何在 nunjuncks 中乘以数据?
- swift - 为什么不能在swift中将可变参数标记为inout?
- vue.js - Vue Js 2 / Vue-CLI 3 / 托管时显示空白页