首页 > 试题广场 >

已知表tbl中字段land_ID建有索引,字段cust_id

[单选题]
已知表tbl中字段land_ID建有索引,字段cust_id建有唯一索引,下列语句查询逻辑相同,其中执行效率最优的是
  • SELECT * FROM tbl
    WHERE land_id > 750
    or (cust_id=180 or cust_id=560)
  • SELECT * FROM tbl
    WHERE (cust_id=180 or cust_id=560)
    or land_id > 750
  • SELECT * FROM tbl WHERE land_id > 750
    UNION
    SELECT * FROM tbl WHERE cust_id = 180
    UNION
    SELECT * FROM tbl WHERE cust_id = 560
  • SELECT * FROM tbl WHERE land_id > 750
    UNION
    ( SELECT * FROM tbl WHERE cust_id = 180
    UNION ALL
    SELECT * FROM tbl WHERE cust_id = 560)
<br>指的是什么意思呢?
发表于 2016-04-03 21:09:25 回复(3)
应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如: 
select id from t where num=10 or num=20 
可以这样查询: 
select id from t where num=10 
union all 
select id from t where num=20
发表于 2015-05-10 15:42:44 回复(3)
题目看起来好乱啊  整理一下:
A:
SELECT * FROM tbl
WHERE land_id > 750
or (cust_id=180 or cust_id=560)

B:
SELECT * FROM tbl
WHERE (cust_id=180 or cust_id=560)
or land_id > 750

C:
SELECT * FROM tbl WHERE land_id > 750
UNION
SELECT * FROM tbl WHERE cust_id = 180
UNION
SELECT * FROM tbl WHERE cust_id = 560

D:
SELECT * FROM tbl WHERE land_id > 750
UNION
( SELECT * FROM tbl WHERE cust_id = 180
UNION ALL
SELECT * FROM tbl WHERE cust_id = 560)

编辑于 2016-04-08 16:18:26 回复(3)
C与D的区别:
union和union all的区别是,union会自动压缩多个结果集合中的重复结果,而union all则将所有的结果全部显示出来,不管是不是重复。
发表于 2015-08-20 20:57:20 回复(7)
因为字段cust_id建有唯一索引,不会有重复的结果,所以直接使用 Union All,更快。
发表于 2016-09-03 10:24:23 回复(0)
Union因为要进行重复值扫描,所以效率低。如果合并没有刻意要删除重复行,那么就使用Union All
发表于 2016-08-31 11:40:09 回复(0)
or 会放弃使用索引而进行全表扫描,union all 比 union 更快
选d
发表于 2016-09-23 09:28:30 回复(0)
答案:D。
A:错误。or使左右两边索引失效。
B:错误。同A。
C:错误。见D。
D:正确。两者区别是:UNION并集之后,还会进行默认规则的排序,而UNION ALL不进行排序。
索引失效的几种情况:
1.违反最左前缀原则,索引失效;
2.在索引列上进行运算操作, 索引将失效;
3.字符串不加单引号,造成索引失效;
4.用 OR 分割条件,索引失效,导致全表查询;
5.以 % 开头的 LIKE 模糊查询,索引失效(如果是尾部模糊匹配,即'字段%',索引不会失效,头部,即'%字段%'则失效),可以使用覆盖索引解决;
6.系统优化为全表扫描,如果 MySQL 评估使用索引比全表更慢,则不使用索引,索引失效。
发表于 2022-02-10 19:07:47 回复(0)
加深记忆:应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描。
发表于 2018-05-10 23:52:18 回复(1)
union和union all的区别是,union会自动去掉结果集中的重复记录,而union all包含所有的重复记录。
发表于 2021-07-21 16:34:37 回复(0)
funion就是把两个找到的结果拼接成一个新表,因此需要有相同的属性(列)
发表于 2021-04-22 01:33:38 回复(0)
应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描
发表于 2021-03-12 17:23:46 回复(0)
UNION ALL 相比 UNION 不需要对结果集进行去重操作,性能更好。因为是按照唯一索引检索的结果,所以不需要去重。
发表于 2021-03-10 16:34:56 回复(0)
有索引 若where后出现or,索引会失效。 unoin all 比union快
发表于 2020-08-19 11:56:11 回复(0)
应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描。
发表于 2017-02-01 11:52:40 回复(0)
应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描
发表于 2016-03-23 11:04:19 回复(0)