首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mysql -查询性能

问Mysql -查询性能
EN

Stack Overflow用户
提问于 2018-12-28 02:14:42
回答 4查看 52关注 0票数 0

我的mysql表中没有数据,所以我不能检查哪条sql语句更快。

我有一个包含列的表: ID | user1 | user2 |表将有大约一百万条记录,我需要从列user1或user2中选择id_user (int)。

第一个查询:

代码语言:javascript
复制
SELECT `id`, `data` FROM `table` WHERE `user1` = :id_user OR `user2` = :id_user

或第二个查询:

代码语言:javascript
复制
SELECT `id`, `data` FROM `table` WHERE concat(user1, '/' user2) LIKE '%:id_user%'

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

EN

回答 4

Stack Overflow用户

发布于 2018-12-28 02:21:43

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

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

根据评论,您应该在user1上有一个索引,在user2上有一个索引,这样查询就会有很高的性能。

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

有了这样的结构,您就不需要使用WHERE user1 = something OR user2 = something进行查询。

票数 4
EN

Stack Overflow用户

发布于 2018-12-28 02:22:12

你可以在你的查询前准备“解释”,获得更多关于你的查询的信息。即使您的表中只有少量示例条目的本地数据库也是如此。它将提供一些有关使用的索引/键的信息。

https://dev.mysql.com/doc/refman/8.0/en/using-explain.html

https://dev.mysql.com/doc/refman/8.0/en/explain-output.html

代码语言:javascript
复制
EXPLAIN SELECT `id`, `data` FROM `table` WHERE `user1` = :id_user OR `user2` = :id_user

EXPLAIN SELECT `id`, `data` FROM `table` WHERE concat(user1, '/' user2) LIKE '%:id_user%'
票数 1
EN

Stack Overflow用户

发布于 2018-12-28 02:30:13

当然,第一次查询速度更快。将id转换为字符串,连接,使用"like“按字符串(而不是索引)搜索。我不知道第二个查询的速度会更慢。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53949181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档