分段分配数据库
发布时间:2025-06-24 19:24:49 作者:北方职教升学中心 阅读量:262
:随机生成但是存储效率低。
题目:优化大表分页查询 SELECT * FROM users ORDER BY id LIMIT 1000000, 10;。UUID。
SELECT e.name, d.dept_nameFROM employees eJOIN departments d ON e.dept_id = d.id;
4. 子查询与 EXISTS。
回答: 。 。
题目:出现在以下查询的执行计划中 Full Table Scan,如何优化#xff1f;
SELECT * FROM products WHERE category = 'Electronics' AND price > 1000;
答案:
添加联合索引 (category, price):
CREATE INDEX idx_category_price ON products (category, price);
10. 复杂的场景设计。
题目:统计每个部门(dept_id)平均工资,仅表明平均工资高于平均工资 15000 的部门。
SELECT name, hire_date FROM employees WHERE salary > 10000 AND dept_id = 5;
2. 聚合函数和分组。
题目:分别执行以下操作,如何发生死锁#xff1f;
事务1:UPDATE accounts SET balance = balance - 100 WHERE id = 1; UPDATE accounts SET balance = balance + 100 WHERE id = 2;
事务2:UPDATE accounts SET balance = balance - 200 WHERE id = 2; UPDATE accounts SET balance = balance + 200 WHERE id = 1;
答案:
事务1锁定id#61;等待idɣ2,事务2锁定id=等待idɤ1,形成循环等待。
:为每个节点分配中央数据库的ID范围。题目:编写存储过程根据输入城市名的动态查询 customers 表。题目:统计每小时订单最多的前三个小时(表 orders 含字段 order_time)。
题目:如何实现“扣库存时防止超卖”?答案:
-- 事务中的原子操作(以 MySQL 例)START TRANSACTION;SELECT stock FROM products WHERE id = 100 FOR UPDATE;UPDATE products SET stock = stock - 1 WHERE id = 100 AND stock > 0;COMMIT;SELECT dept_id, AVG(salary) AS avg_salaryFROM employeesGROUP BY dept_idHAVING AVG(salary) > 15000;
3. 多表连接(JOIN)
题目:查询员工姓名(name)所属部门名称(dept_name),表结构为 employees(id, name, dept_id)和 departments(id, dept_name)。
今天给大家带来一个大厂SQL面试覆盖:基础语法 → 复杂查询 → 性能优化 → 架构设计我们需要深入了解实施原则,
-- 以 PostgreSQL 以CREATE为例 OR REPLACE PROCEDURE get_customers_by_city(city_name TEXT)LANGUAGE plpgsqlAS $$BEGIN EXECUTE 'SELECT * FROM customers WHERE city = $1' USING city_name;END;$$;
19. 分布式ID生成方案。
WITH RECURSIVE sub_categories AS ( SELECT id, name, parent_id FROM categories WHERE id = 5 UNION ALL SELECT c.id, c.name, c.parent_id FROM categories c JOIN sub_categories sc ON c.parent_id = sc.id)SELECT * FROM sub_categories;
7. 索引优化。题目:删除 logs #xff08表中重复记录;保留id最小的)。题目:计算每个员工工资与所在部门的平均工资之间的差额。
20. 保证数据一致性。
题目:分布式系统,如何设计全局唯一的订单ID?f;
答案: 。
题目:编写存储过程根据输入城市名的动态查询 customers 表。题目:统计每小时订单最多的前三个小时(表 orders 含字段 order_time)。
题目:如何实现“扣库存时防止超卖”?答案:
-- 事务中的原子操作(以 MySQL 例)START TRANSACTION;SELECT stock FROM products WHERE id = 100 FOR UPDATE;UPDATE products SET stock = stock - 1 WHERE id = 100 AND stock > 0;COMMIT;SELECT dept_id, AVG(salary) AS avg_salaryFROM employeesGROUP BY dept_idHAVING AVG(salary) > 15000;
3. 多表连接(JOIN)
题目:查询员工姓名(name)所属部门名称(dept_name),表结构为 employees(id, name, dept_id)和 departments(id, dept_name)。
今天给大家带来一个大厂SQL面试覆盖:基础语法 → 复杂查询 → 性能优化 → 架构设计我们需要深入了解实施原则,
-- 以 PostgreSQL 以CREATE为例 OR REPLACE PROCEDURE get_customers_by_city(city_name TEXT)LANGUAGE plpgsqlAS $$BEGIN EXECUTE 'SELECT * FROM customers WHERE city = $1' USING city_name;END;$$;
19. 分布式ID生成方案。
WITH RECURSIVE sub_categories AS ( SELECT id, name, parent_id FROM categories WHERE id = 5 UNION ALL SELECT c.id, c.name, c.parent_id FROM categories c JOIN sub_categories sc ON c.parent_id = sc.id)SELECT * FROM sub_categories;
7. 索引优化。题目:删除 logs #xff08表中重复记录;保留id最小的)。题目:计算每个员工工资与所在部门的平均工资之间的差额。
20. 保证数据一致性。
题目:分布式系统,如何设计全局唯一的订单ID?f;
答案: 。
1. 基础查询和过滤。
题目:在 orders 表中,如何为 customer_id 和 order_date 设计联合索引优化查询 WHERE customer_id = 100 AND order_date > '2024-02-10'?
答案:
CREATE INDEX idx_customer_order_date ON orders (customer_id, order_date);
13. 数据去重。 16. JSON 数据处理。
原理:联合索引按照最左前缀匹配原则,优先按 customer_id 过滤,再按 order_date 范围查询。
。 。
WITH hourly_orders AS ( SELECT EXTRACT(HOUR FROM order_time) AS hour, COUNT(*) AS order_count FROM orders GROUP BY EXTRACT(HOUR FROM order_time))SELECT hour, order_countFROM hourly_ordersORDER BY order_count DESCLIMIT 3;
题目:如何按时间范围正确 sales 表格分区优化查询性能?答案:
-- 按月分区(以 PostgreSQL 例)CREATE TABLE sales ( sale_id SERIAL, sale_date DATE, amount NUMERIC) PARTITION BY RANGE (sale_date);CREATE TABLE sales_2023_01 PARTITION OF sales FOR VALUES FROM ('2024-01-10') TO ('2024-02-10');
题目:设计数据库表结构,支持用户每天签到(可以重复签到,SELECT最近30天签到的次数 COUNT(*) FROM user_checkins WHERE user_id = 100 AND checkin_date >= CURRENT_DATE - INTERVAL '30 days';
11. 分析和解决死锁问题。
8. 事务与隔离等级。 分段分配数据库。
题目:查询无订单的客户(customers 表的 id 不在 orders 表的 customer_id 中间)。 幻读:在同一事务中两次查询同一范围的数据,结果行数不同(其他事务 INSERT 导致)。
DELETE FROM logsWHERE id NOT IN ( SELECT MIN(id) FROM logs GROUP BY user_id, log_time, content);
14. 分页查询优化。雪花算法(Snowflake)
:时间戳 + 机器ID + 序列号。
SELECT c.id, c.nameFROM customers cWHERE NOT EXISTS ( SELECT 1 FROM orders o WHERE o.customer_id = c.id);
5. 窗口函数。 #xff1不能重复阅读a;同一行数据在同一事务中读取两次c;不同的结果(其他事务 UPDATE 或 DELETE 导致)。 。
标题:解释“不能重复”(Non-Repeatable Read)和“幻读”(Phantom Read)的区别。
答案:
使用覆盖索引 + #xff1a;
SELECT * FROM users WHERE id > 1000000 ORDER BY id LIMIT 10;
15. 分区表设计。
-- 以 MySQL 以SELECT为例 attributes->>'$.color' AS color, attributes->>'$.size' AS sizeFROM products;
17. 高级窗口函数。
WITH ranked_employees AS ( SELECT name, salary, dept_id, RANK() OVER (PARTITION BY dept_id ORDER BY salary DESC) AS rank FROM employees)SELECT name, salary, dept_idFROM ranked_employeesWHERE rank <= 3;
6. 递归查询(CTE)
题目:查询树形结构表 categories(id, name, parent_id)中 ID=5 所有子节点。
标题:查询各部门工资排名前的情况 3 员工姓名及薪资。熟悉实际业务场景的解决方案。 。 #xff1解决方案a;
按固定顺序更新#xff08;先更新id小账户)。题目:从 products 表的 attributes(JSON 字段)提取颜色(color)和尺寸(size)。
SELECT name, salary, salary - AVG(salary) OVER (PARTITION BY dept_id) AS diff_from_avgFROM employees;
18. 动态SQL和存储过程。但只是第一次有效),最近统计了一个用户 30 天签到次数。
题目:从 products 表的 attributes(JSON 字段)提取颜色(color)和尺寸(size)。
SELECT name, salary, salary - AVG(salary) OVER (PARTITION BY dept_id) AS diff_from_avgFROM employees;
12. 统计时间窗。
9. 实施计划分析。
标题:查询 employees 表中所有工资(salary)大于 10000 部门编号(dept_id)为 5 员工姓名(name)入职日期(hire_date)。
答案:
CREATE TABLE user_checkins ( user_id INT, checkin_date DATE, PRIMARY KEY (user_id, checkin_date) -- 避免重复的唯一约束);-- 据统计,