面试题答案
一键面试SQL语句
SELECT product_id, sale_date, quantity, price
FROM product_sales
WHERE product_id IN (
-- 这里列出10000个产品ID
'product_id_1', 'product_id_2', ..., 'product_id_10000'
) AND quantity > 100;
性能调优
- 索引优化
- 单列索引:在
product_sales
表的product_id
和quantity
字段上分别创建单列索引。例如,在MySQL中可以使用以下语句创建索引:
- 单列索引:在
CREATE INDEX idx_product_id ON product_sales(product_id);
CREATE INDEX idx_quantity ON product_sales(quantity);
- 复合索引:如果查询经常同时基于
product_id
和quantity
过滤,可以考虑创建复合索引。例如:
CREATE INDEX idx_product_id_quantity ON product_sales(product_id, quantity);
在复合索引中,字段顺序很重要,通常将选择性高(即不同值多)的字段放在前面。这里product_id
的选择性通常比quantity
高,所以放在前面。
2. 查询改写
- 使用JOIN代替IN:如果这10000个产品ID存储在另一个表(假设为
product_list
,包含product_id
字段)中,可以使用JOIN来改写查询。例如在MySQL中:
SELECT ps.product_id, ps.sale_date, ps.quantity, ps.price
FROM product_sales ps
JOIN product_list pl ON ps.product_id = pl.product_id
WHERE ps.quantity > 100;
- 分页查询:如果查询结果集很大,可以采用分页查询,每次只返回一部分数据。例如在MySQL中使用
LIMIT
和OFFSET
:
SELECT product_id, sale_date, quantity, price
FROM product_sales
WHERE product_id IN (
'product_id_1', 'product_id_2', ..., 'product_id_10000'
) AND quantity > 100
LIMIT 100 OFFSET 0;
这里LIMIT 100
表示每页返回100条记录,OFFSET 0
表示从第1条记录开始。随着页数增加,OFFSET
相应增加。
3. 数据库配置优化
- 增加缓存:使用查询缓存(如MySQL的Query Cache,不过MySQL 8.0已弃用)或应用层缓存(如Redis)来缓存经常查询的结果。这样对于相同的查询,直接从缓存中获取数据,减少数据库的负载。
- 调整数据库参数:根据服务器的硬件资源(如内存、CPU等)调整数据库的相关参数。例如,在MySQL中,可以适当增加
innodb_buffer_pool_size
参数的值,以提高InnoDB存储引擎的数据缓存能力,减少磁盘I/O。