面试题答案
一键面试查询语句
假设使用的是 MongoDB,示例查询语句如下:
db.products.find({
category: "特定类别",
price: { $gte: 最低价, $lte: 最高价 }
}).sort({
rating: -1,
sales_volume: 1
});
如果是 MySQL,查询语句如下:
SELECT product_name, price, category, sales_volume, rating
FROM products
WHERE category = '特定类别' AND price BETWEEN 最低价 AND 最高价
ORDER BY rating DESC, sales_volume ASC;
索引创建策略
-
复合索引:
- 对于 MongoDB,创建如下复合索引:
db.products.createIndex({category: 1, price: 1, rating: -1, sales_volume: 1});
- 对于 MySQL,创建复合索引:
CREATE INDEX idx_category_price_rating_sales ON products (category, price, rating DESC, sales_volume ASC);
- 这样的复合索引顺序很重要,前导列是
category
和price
,符合查询的WHERE
条件,rating
和sales_volume
用于排序。
- 对于 MongoDB,创建如下复合索引:
-
覆盖索引:
- 在 MySQL 中,如果查询的字段只有
rating
和sales_volume
,可以使用覆盖索引来避免回表操作。例如:CREATE INDEX idx_cover ON products (category, price, rating DESC, sales_volume ASC, product_name, rating, sales_volume);
- 这里添加了查询中涉及的其他字段,使得查询可以直接从索引中获取所有需要的数据,而不需要再回表到数据行获取。
- 在 MySQL 中,如果查询的字段只有
优化思路
- 数据分布分析:了解
category
、price
等字段的数据分布情况,如果某些category
值的记录数很少,可以考虑对这些小数据量的类别进行单独处理。 - 分区表:如果数据量非常大,可以考虑对表按
category
或price
进行分区,这样在查询特定category
或price
区间时,可以快速定位到相关分区,减少扫描的数据量。 - 查询缓存:在应用层或数据库层面(如 MySQL 有查询缓存机制)缓存查询结果,对于相同条件的查询可以直接返回缓存结果,减少数据库的查询压力。