多选题:
关于索引的匹配规则的说法,以下哪些是正确的?
A 查询条件在SQL中的先后顺序不影响索引匹配的结果
B 组合索引中的字段顺序不影响查询条件的匹配结果
C 遇到第一个范围查询字段后,后续的字段不参与匹配
D 查询条件中的索引字段如果不能参与匹配,依然可以提供过滤
正确答案ACD,A正确为啥B不正确,感觉AB意思一样
多选题:
关于索引的匹配规则的说法,以下哪些是正确的?
A 查询条件在SQL中的先后顺序不影响索引匹配的结果
B 组合索引中的字段顺序不影响查询条件的匹配结果
C 遇到第一个范围查询字段后,后续的字段不参与匹配
D 查询条件中的索引字段如果不能参与匹配,依然可以提供过滤
正确答案ACD,A正确为啥B不正确,感觉AB意思一样
索引设计遵循 最左前缀,匹配度高的字段应该放在最左。所以 B 错的
组合索引中字段的顺序会显著影响查询性能,虽然理论上不影响结果的正确性,但会影响查询能否有效利用索引。
假设有组合索引 (last_name, first_name, age)
-- 使用索引前缀
WHERE last_name = '张'
WHERE last_name = '张' AND first_name = '三'
WHERE last_name = '张' AND first_name = '三' AND age = 25
-- 使用索引最左前缀原则
WHERE last_name = '张' AND age > 20 -- 只能用到last_name部分
-- 缺少最左字段
WHERE first_name = '三' -- 无法使用索引
WHERE age = 25 -- 无法使用索引
WHERE first_name = '三' AND age = 25 -- 无法使用索引
组合索引的查询必须从最左边的字段开始,才能有效利用索引:
索引: (A, B, C)
有效使用:
✓ A = ?
✓ A = ? AND B = ?
✓ A = ? AND B = ? AND C = ?
✓ A = ? AND C = ? -- 只用到A字段
无效使用:
✗ B = ?
✗ C = ?
✗ B = ? AND C = ?
-- 更好的索引设计
-- 假设经常按部门查询,再按薪资范围筛选
CREATE INDEX idx_dept_salary ON employees(department, salary);
-- 常用查询
SELECT * FROM employees
WHERE department = 'IT' AND salary > 5000; -- 能有效使用索引
虽然组合索引字段顺序不影响查询结果的正确性,但它严重影响查询性能。正确的字段顺序设计是数据库优化的重要环节。
ACD,这题只有B不对,索引顺序有影响的,如下:
idx_1(name,age)
idx_2(age, name)
学习学习
666