我的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%'
哪个查询将更快地选择数据?
4条答案
按热度按时间hgqdbh6s1#
在表的一列或多列上应用函数并在where子句中使用该函数时,不能使用索引。为了得到结果,将从上到下扫描表格。
您可以将其视为“计算”列。为了评估比较,db必须“计算”该列,因此它不再是数据库中存在的静态列,而是更类似于一个变量。在本例中,您将合并两列并创建一个伪列。对于计算列,不存在索引,因此数据库必须读取行数据,进行计算,然后计算比较。如果您使用
EXPLAIN
您将看到这个查询表扫描了所有100万行。根据注解,您应该在user1上有一个索引,在user2上有一个索引,查询的性能会很高。
我不知道这个应用程序,但是带有一个列名('user')和一个迭代(user1,user2)的实现通常表示一个重复组,该组应该被规范化为多对多关系。
有了这样的结构,就不会有
WHERE user1 = something OR user2 = something
.pvcm50d12#
如前所述;两个查询都不会有效率。以下是解决方法:
并具有以下索引:
这样,处理将非常快速地执行每项操作
SELECT
,然后使用UNION
.请进一步注意,如果没有重叠(或者您不在乎),那么使用它会更快
UNION ALL
. 说UNION DISTINCT
重复数据消除组合选择的结果。更多关于索引的信息。
o7jaxewo3#
当然,第一个查询速度更快。将id转换为string,concat,用“like”按字符串(而不是索引)搜索。我不知道第二个问题会有什么进展。
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