查询性能

vltsax25  于 2021-06-17  发布在  Mysql
关注(0)|答案(4)|浏览(237)

我的mysql表中没有数据,所以我无法检查哪个sql语句会更快。
我有一个带有列的表:id | user1 | user2 |表将有大约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%'

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

hgqdbh6s

hgqdbh6s1#

在表的一列或多列上应用函数并在where子句中使用该函数时,不能使用索引。为了得到结果,将从上到下扫描表格。
您可以将其视为“计算”列。为了评估比较,db必须“计算”该列,因此它不再是数据库中存在的静态列,而是更类似于一个变量。在本例中,您将合并两列并创建一个伪列。对于计算列,不存在索引,因此数据库必须读取行数据,进行计算,然后计算比较。如果您使用 EXPLAIN 您将看到这个查询表扫描了所有100万行。
根据注解,您应该在user1上有一个索引,在user2上有一个索引,查询的性能会很高。
我不知道这个应用程序,但是带有一个列名('user')和一个迭代(user1,user2)的实现通常表示一个重复组,该组应该被规范化为多对多关系。
有了这样的结构,就不会有 WHERE user1 = something OR user2 = something .

pvcm50d1

pvcm50d12#

如前所述;两个查询都不会有效率。以下是解决方法:

( SELECT `id`, `data` FROM `table` WHERE `user1` = :id_user )
UNION DISTINCT
( SELECT `id`, `data` FROM `table` WHERE `user2` = :id_user )

并具有以下索引:

INDEX(user1)
INDEX(user2)

这样,处理将非常快速地执行每项操作 SELECT ,然后使用 UNION .
请进一步注意,如果没有重叠(或者您不在乎),那么使用它会更快 UNION ALL . 说 UNION DISTINCT 重复数据消除组合选择的结果。
更多关于索引的信息。

o7jaxewo

o7jaxewo3#

当然,第一个查询速度更快。将id转换为string,concat,用“like”按字符串(而不是索引)搜索。我不知道第二个问题会有什么进展。

7vhp5slm

7vhp5slm4#

你可以在你的查询前准备和“解释”,并获得关于你的查询的更多信息。即使您有一个本地数据库,表中的示例条目数量很少。它将提供一些有关所用索引/键的信息。
https://dev.mysql.com/doc/refman/8.0/en/using-explain.html
https://dev.mysql.com/doc/refman/8.0/en/explain-output.html

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

相关问题