MST

星途 面试题库

面试题:MySQL查询语句优化之避免SELECT * - 高级难度

现有两张表,`orders`表(字段:`order_id`、`customer_id`、`order_date`、`total_amount`等)和`customers`表(字段:`customer_id`、`customer_name`、`contact_number`等)。要查询出每个订单的`order_id`、`customer_name`和`total_amount`,请写出优化后的查询语句,并说明若使用`SELECT *`在性能和维护性方面可能存在的问题。
20.9万 热度难度
数据库MySQL

知识考点

AI 面试

面试题答案

一键面试

查询语句

SELECT 
    o.order_id, 
    c.customer_name, 
    o.total_amount
FROM 
    orders o
JOIN 
    customers c ON o.customer_id = c.customer_id;

使用SELECT *在性能和维护性方面的问题

  1. 性能问题
    • 数据传输量增大SELECT *会选择表中的所有列,包括一些可能不需要的列。这会增加从数据库到应用程序的数据传输量,尤其是在网络带宽有限的情况下,会导致查询速度变慢。
    • 索引利用率降低:数据库优化器在生成执行计划时,可能无法有效地利用索引。例如,如果只需要特定的几列,数据库可以使用覆盖索引(covering index)来直接获取所需数据,而SELECT *可能会使优化器选择全表扫描,降低查询性能。
  2. 维护性问题
    • 代码可读性变差:在查询结果集不确定具体列的情况下,阅读和理解代码变得困难。开发人员需要查看表结构才能知道返回了哪些列,这增加了代码维护的难度。
    • 兼容性问题:如果表结构发生变化,例如添加了新列,使用SELECT *的查询可能会返回意外的数据。这可能会导致应用程序逻辑出现错误,而这些错误可能很难调试,因为结果集中的新列可能会影响代码的处理逻辑。