mysql面试题
1. select a from table where b=? and (c=? or d=?);怎么建立索引?
出自快手
在这种情况下,你可以考虑创建一个复合索引来优化查询性能。复合索引是基于多个列的索引,可以加速在这些列上进行的过滤和匹配操作。对于你的查询语句 SELECT a FROM table WHERE b=? AND (c=? OR d=?),你可以考虑创建一个包含列 b、c 和 d 的复合索引。
以下是如何创建这个复合索引的示例 SQL 语句:
CREATE INDEX idx_table_b_c_d ON table (b, c, d);
这将在表 table 上创建一个名为 idx_table_b_c_d 的索引,包括列 b、c 和 d。
但是
,对于这个查询语句 SELECT a FROM table WHERE b=? AND (c=? OR d=?)
,由于存在 OR
条件,实际上索引 idx_table_b_c_d
中的 c
和 d
部分将不会同时用于加速查询。
在这个查询中,OR
条件的性质会导致优化器在查询时选择一个条件进行过滤,然后再针对结果集进行额外的筛选。因此,只有 b
部分会被用于索引的加速,而 c
和 d
部分不会被直接用于索引加速。
所以,如果你的查询重点在于优化这个特定的查询语句,一个更好的索引策略可能是考虑单独为列 b
建立索引,而不需要包含 c
和 d
列。这样可以最大程度地利用索引来加速 WHERE b=?
的条件筛选。
如果就是要建立b、c、d的联合索引,查询语句可以怎么优化?
如果你决定要继续建立联合索引包含列 b
、c
和 d
,并且你希望优化查询语句 SELECT a FROM table WHERE b=? AND (c=? OR d=?)
,以下是一些建议来优化这个查询:
重写查询条件: 考虑重写查询条件,以避免
OR
条件。例如,你可以分成两个查询,一个查询处理c=?
的条件,另一个查询处理d=?
的条件,然后将结果合并。-- 查询条件 c=? SELECT a FROM table WHERE b=? AND c=?; -- 查询条件 d=? SELECT a FROM table WHERE b=? AND d=?;
这种重写可以允许数据库优化器更充分地利用索引。
拆分
OR
条件: 如果你不能避免使用OR
条件,你可以尝试拆分查询成两个部分,然后使用UNION
运算符将结果合并。-- 查询条件 c=? 和 b=? SELECT a FROM table WHERE b=? AND c=? UNION -- 查询条件 d=? 和 b=? SELECT a FROM table WHERE b=? AND d=?;
这可以使数据库优化器更好地使用索引,因为每个查询都只包含一个条件。
使用适当的索引提示: 根据数据库系统的支持,你可能可以使用索引提示(Index Hint)来指导优化器使用特定的索引。但这样做通常是在极端情况下考虑的。
性能测试和分析: 无论使用哪种方法,都建议使用数据库系统提供的性能分析工具(如
EXPLAIN
命令)来查看查询的执行计划,以及索引是否被充分利用。这将帮助你了解查询是如何执行的,以及是否需要进一步调整和优化。