我想知道使用像这样的东西是否有缺点(除了不好的做法)
SELECT * FROM my_table WHERE id LIKE '1';
其中id是整数。我知道你应该使用id = 1但是我正在编写一个java程序,如果一切都可以使用LIKE它对我来说会容易得多。此外,到目前为止,一切正常;我得到了正确的查询结果,所以如果没有任何缺点,我会继续这样做。
编辑:我正在使用MySQL。
答案 0 :(得分:3)
MySQL会允许它,但会忽略索引:
mysql> describe METADATA_44;
+---------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| AtextId | int(11) | NO | PRI | NULL | |
| num | varchar(128) | YES | | NULL | |
| title | varchar(128) | YES | | NULL | |
| file | varchar(128) | YES | | NULL | |
| context | varchar(128) | YES | | NULL | |
| source | varchar(128) | YES | | NULL | |
+---------+--------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
mysql> explain select * from METADATA_44 where Atextid like '7';
+----+-------------+-------------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------------+------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE | METADATA_44 | ALL | PRIMARY | NULL | NULL | NULL | 591 | Using where |
+----+-------------+-------------+------+---------------+------+---------+------+------+-------------+
mysql> explain select * from METADATA_44 where Atextid=7;
+----+-------------+-------------+-------+---------------+---------+---------+-------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------------+-------+---------------+---------+---------+-------+------+-------+
| 1 | SIMPLE | METADATA_44 | const | PRIMARY | PRIMARY | 4 | const | 1 | |
+----+-------------+-------------+-------+---------------+---------+---------+-------+------+-------+
1 row in set (0.00 sec)
答案 1 :(得分:2)
您需要查看RDBMS上的查询执行计划,以验证没有通配符的LIKE
是否与=
一样有效。 SQL Server中的快速测试表明,它会为您提供索引扫描而不是搜索,因此我想在生成计划时不会考虑这一点,而使用=
的SQL Server会更有效。我没有MySQL安装来测试。
编辑:只是为了更新这个SQL Server似乎处理得很好,并在数据类型为varchar时进行搜索。在获得扫描时,它是针对int列运行的。这是因为它在int列上进行了对varchar的隐式转换,因此无法使用索引。
答案 2 :(得分:1)
最好将查询编写为
SELECT * FROM my_table WHERE id = 1;
否则mysql必须将'1'强制转换为int,这是列id
的类型
因此,当您知道列的类型根据该类型提供值时,显然会有一个小的性能损失
答案 3 :(得分:0)
速度。 [15-char填充物,因为没有更多的话要说]
答案 4 :(得分:0)
如果没有LIKE
的任何通配符,如果速度/效率是你不打扰的话,应该可以满足你的需求。