我的mysql表中没有数据,所以我不能检查哪条sql语句更快。
我有一个包含列的表: ID | user1 | user2 |表将有大约一百万条记录,我需要从列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%'哪个查询会更快地选择数据?
发布于 2018-12-28 02:21:43
任何时候在表的一列或多列上应用函数并在WHERE子句中使用该函数时,都不能使用索引。为了得到结果,表将从上到下进行扫描。
您可以将其视为“计算”列。为了评估比较,DB必须“计算”列,因此它不再是存在于数据库中的静态列,而更类似于变量。在您的示例中,您组合了2列并创建了一个伪列。对于计算列,不存在索引,因此数据库必须读取行数据,执行计算,然后评估比较。如果使用EXPLAIN查看查询,您将看到该查询表扫描了全部100万行。
根据评论,您应该在user1上有一个索引,在user2上有一个索引,这样查询就会有很高的性能。
我不知道这个应用程序,但具有列名('user')和迭代(user1,user2)的实现通常表示一个重复的组,它应该被规范化为多对多关系。
有了这样的结构,您就不需要使用WHERE user1 = something OR user2 = something进行查询。
发布于 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
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%'发布于 2018-12-28 02:30:13
当然,第一次查询速度更快。将id转换为字符串,连接,使用"like“按字符串(而不是索引)搜索。我不知道第二个查询的速度会更慢。
https://stackoverflow.com/questions/53949181
复制相似问题