跳至主要內容

mysql面试题

暴走の海鸽约 864 字大约 3 分钟

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 中的 cd 部分将不会同时用于加速查询。

在这个查询中,OR 条件的性质会导致优化器在查询时选择一个条件进行过滤,然后再针对结果集进行额外的筛选。因此,只有 b 部分会被用于索引的加速,而 cd 部分不会被直接用于索引加速。

所以,如果你的查询重点在于优化这个特定的查询语句,一个更好的索引策略可能是考虑单独为列 b 建立索引,而不需要包含 cd 列。这样可以最大程度地利用索引来加速 WHERE b=? 的条件筛选。

如果就是要建立b、c、d的联合索引,查询语句可以怎么优化?

如果你决定要继续建立联合索引包含列 bcd,并且你希望优化查询语句 SELECT a FROM table WHERE b=? AND (c=? OR d=?),以下是一些建议来优化这个查询:

  1. 重写查询条件: 考虑重写查询条件,以避免 OR 条件。例如,你可以分成两个查询,一个查询处理 c=? 的条件,另一个查询处理 d=? 的条件,然后将结果合并。

    -- 查询条件 c=?
    SELECT a FROM table WHERE b=? AND c=?;
    
    -- 查询条件 d=?
    SELECT a FROM table WHERE b=? AND d=?;
    

    这种重写可以允许数据库优化器更充分地利用索引。

  2. 拆分 OR 条件: 如果你不能避免使用 OR 条件,你可以尝试拆分查询成两个部分,然后使用 UNION 运算符将结果合并。

    -- 查询条件 c=? 和 b=?
    SELECT a FROM table WHERE b=? AND c=?
    UNION
    -- 查询条件 d=? 和 b=?
    SELECT a FROM table WHERE b=? AND d=?;
    

    这可以使数据库优化器更好地使用索引,因为每个查询都只包含一个条件。

  3. 使用适当的索引提示: 根据数据库系统的支持,你可能可以使用索引提示(Index Hint)来指导优化器使用特定的索引。但这样做通常是在极端情况下考虑的。

  4. 性能测试和分析: 无论使用哪种方法,都建议使用数据库系统提供的性能分析工具(如 EXPLAIN 命令)来查看查询的执行计划,以及索引是否被充分利用。这将帮助你了解查询是如何执行的,以及是否需要进一步调整和优化。