我正在查询mySQL数据库以从1个特定行检索数据.我正在使用表主键作为WHERE约束参数.
例如
SELECT name FROM users WHERE userid = 4
Run Code Online (Sandbox Code Playgroud)
userid列是表的主键.在mySQL语句的末尾使用LIMIT 1是一种好习惯吗?或者有速度优势吗?
OMG*_*ies 13
userid列是表的主键.在mySQL语句的末尾使用LIMIT 1是一种好习惯吗?或者有速度优势吗?
LIMIT 1在示例的最后使用是不好的做法- 这完全没必要,因为userid列是主键.主键表示表中只有一行/记录具有该值,只返回一行/记录.
但最终的指标是解释计划:
explain SELECT t.name FROM USERS t WHERE t.userid = 4
Run Code Online (Sandbox Code Playgroud)
...的回报:
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra
-----------------------------------------------------------------------------------------------------
1 | SIMPLE | users | const | PRIMARY | PRIMARY | 4 | const | 1 |
Run Code Online (Sandbox Code Playgroud)
...和:
explain SELECT t.name FROM USERS t WHERE t.userid = 4 LIMIT 1
Run Code Online (Sandbox Code Playgroud)
...的回报:
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra
-----------------------------------------------------------------------------------------------------
1 | SIMPLE | users | const | PRIMARY | PRIMARY | 4 | const | 1 |
Run Code Online (Sandbox Code Playgroud)
没有区别,没有必要.在这种情况下似乎已经优化(仅针对主键进行搜索).
如果返回多个行,LIMIT则不使用ORDER BY将返回任意行/记录.例如,使用"John Smith"场景,其中2人以上可以命名为"John Smith":
SELECT t.userid
FROM USERS t
WHERE t.first_name = 'John'
AND t.last_name = 'Smith'
LIMIT 1
Run Code Online (Sandbox Code Playgroud)
......冒着返回userid名字为"John"且姓氏为"Smith"的任何可能值的风险.不能保证始终返回相同的值,并且每次获得不同值的可能性随可能记录的数量而增加.
我个人不关心LIMIT的使用.Oracle,SQL Server或DB2不支持该语法 - 使查询的可移植性降低.LIMIT是一种保守使用的工具,而不是您要达到的第一件事 - 知道何时使用聚合和/或分析功能.
| 归档时间: |
|
| 查看次数: |
19482 次 |
| 最近记录: |