面试题答案
一键面试优化思路
- 索引使用:
- 对于关联查询涉及的列,在相关表上创建索引。例如,如果是基于某个表
table1
的column1
与table2
的column2
进行连接,那么在table1
的column1
和table2
的column2
上分别创建索引。这可以加速连接操作,因为索引能快速定位到匹配的行,减少全表扫描。 - 如果查询中有过滤条件,对过滤条件涉及的列创建索引。例如,若有
WHERE
子句WHERE table3.column3 > 100
,在table3
的column3
上创建索引,这样可以快速筛选出符合条件的行。
- 对于关联查询涉及的列,在相关表上创建索引。例如,如果是基于某个表
- 查询语句优化:
- 尽量避免使用子查询,尤其是多层嵌套子查询,因为子查询可能会导致多次扫描表。可以将子查询改写为连接查询,连接操作通常性能更好。
- 合理使用
JOIN
类型。例如,如果是一对一或多对一关系,优先使用INNER JOIN
,它只返回满足连接条件的行,效率较高。如果需要保留左表或右表的所有行,再考虑LEFT JOIN
或RIGHT JOIN
,但要注意这种情况下可能会产生更多的数据,对性能有一定影响。 - 减少选择列。只选择实际需要的列,避免使用
SELECT *
,因为选择过多列会增加数据传输和处理的开销。
SQL代码示例
假设我们有三个表:orders
(订单表),order_items
(订单项表),products
(产品表),要计算每个订单的总金额(订单项数量 * 产品价格)并返回订单ID和总金额。
-- 创建函数
DELIMITER //
CREATE FUNCTION calculate_order_total(order_id_param INT)
RETURNS DECIMAL(10, 2)
DETERMINISTIC
BEGIN
DECLARE total DECIMAL(10, 2);
SELECT SUM(oi.quantity * p.price) INTO total
FROM orders o
-- 关联订单项表
INNER JOIN order_items oi ON o.order_id = oi.order_id
-- 关联产品表
INNER JOIN products p ON oi.product_id = p.product_id
WHERE o.order_id = order_id_param;
RETURN total;
END //
DELIMITER ;
索引优化
-- 在orders表的order_id列创建索引
CREATE INDEX idx_orders_order_id ON orders(order_id);
-- 在order_items表的order_id和product_id列创建索引
CREATE INDEX idx_order_items_order_id ON order_items(order_id);
CREATE INDEX idx_order_items_product_id ON order_items(product_id);
-- 在products表的product_id列创建索引
CREATE INDEX idx_products_product_id ON products(product_id);
上述示例代码实现了一个计算订单总金额的函数,并给出了相关的索引优化建议。实际应用中,应根据具体的业务逻辑和表结构进行更细致的优化。