SQL LIKE问题

时间:2010-05-23 12:12:50

标签: sql mysql

我想知道使用像这样的东西是否有缺点(除了不好的做法)

SELECT * FROM my_table WHERE id LIKE '1';

其中id是整数。我知道你应该使用id = 1但是我正在编写一个java程序,如果一切都可以使用LIKE它对我来说会容易得多。此外,到目前为止,一切正常;我得到了正确的查询结果,所以如果没有任何缺点,我会继续这样做。

编辑:我正在使用MySQL。

5 个答案:

答案 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的任何通配符,如果速度/效率是你不打扰的话,应该可以满足你的需求。