面试题答案
一键面试Schema调整
- 数据加密存储:
- 对于敏感数据字段,如用户密码、身份证号等,在数据库存储前进行加密处理。可以使用MySQL自带的加密函数,如
CREATE FUNCTION encrypt_data(data VARCHAR(255), key VARCHAR(255)) RETURNS VARCHAR(255) DETERMINISTIC RETURN AES_ENCRYPT(data, key);
,然后在表设计时将对应字段类型设置为足够存储加密后数据的类型(如VARBINARY
)。 - 例如:
CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50), encrypted_password VARBINARY(256), encrypted_id_card VARBINARY(256) );
- 对于敏感数据字段,如用户密码、身份证号等,在数据库存储前进行加密处理。可以使用MySQL自带的加密函数,如
- 分区表:
- 针对可能因DDOS引发数据库异常导致的性能问题,对于大表可以进行分区。例如按时间(如按月分区)对日志表进行分区,这样在面临大量写入(DDOS可能导致日志数据暴增)时,可将数据分散存储,提升查询和维护性能。
- 示例:
CREATE TABLE access_logs ( id INT AUTO_INCREMENT PRIMARY KEY, access_time TIMESTAMP, user_id INT, log_content TEXT ) PARTITION BY RANGE (YEAR(access_time) * 100 + MONTH(access_time)) ( PARTITION p0 VALUES LESS THAN (202301), PARTITION p1 VALUES LESS THAN (202302), -- 依此类推 );
- 增加审计字段:
- 在关键业务表中添加审计字段,如
created_at
(记录数据创建时间)、updated_at
(记录数据最后更新时间)、created_by
(记录创建数据的用户标识)、updated_by
(记录更新数据的用户标识)。这有助于追踪数据的变化,在数据被恶意篡改时能够快速定位可能的来源。 - 例如:
CREATE TABLE products ( id INT AUTO_INCREMENT PRIMARY KEY, product_name VARCHAR(100), price DECIMAL(10, 2), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, created_by INT, updated_by INT );
- 在关键业务表中添加审计字段,如
安全机制整合
- 用户权限管理:
- 严格限制数据库用户权限。只授予每个用户执行其工作所需的最小权限。例如,对于只读用户,只授予
SELECT
权限;对于数据录入用户,授予INSERT
、UPDATE
权限,但限制其可操作的表和字段。 - 创建用户和授权示例:
CREATE USER'read_only_user'@'localhost' IDENTIFIED BY 'password'; GRANT SELECT ON your_database.* TO'read_only_user'@'localhost'; FLUSH PRIVILEGES;
- 严格限制数据库用户权限。只授予每个用户执行其工作所需的最小权限。例如,对于只读用户,只授予
- 数据库防火墙:
- 配置MySQL的内置防火墙或使用外部网络防火墙。通过MySQL的
bind - address
参数限制MySQL服务监听的IP地址,只允许受信任的IP地址连接数据库。例如,在my.cnf
文件中设置bind - address = 192.168.1.100
(假设这是允许连接的服务器IP)。 - 外部网络防火墙可进一步限制入站和出站流量,只允许特定端口(默认为3306)的合法连接。
- 配置MySQL的内置防火墙或使用外部网络防火墙。通过MySQL的
- 数据备份与恢复策略:
- 定期进行全量备份和增量备份。可以使用MySQL的
mysqldump
工具进行全量备份,例如:mysqldump -u root -p your_database > backup.sql
。对于增量备份,可以利用二进制日志(binlog),开启二进制日志记录功能(在my.cnf
中设置log - bin = /var/log/mysql/mysql - bin.log
),然后通过mysqlbinlog
工具结合备份的binlog文件进行数据恢复。 - 同时,将备份数据存储在异地,以防止本地数据因灾难(如物理破坏、恶意攻击导致数据丢失)而无法恢复。
- 定期进行全量备份和增量备份。可以使用MySQL的
性能优化
- 索引优化:
- 分析查询语句,在经常用于
WHERE
、JOIN
、ORDER BY
子句的字段上创建索引。但要注意避免创建过多索引,因为索引会占用额外的存储空间并且在数据插入、更新和删除时会增加维护成本。 - 例如,在
orders
表中,如果经常根据customer_id
查询订单,可创建索引:
CREATE INDEX idx_customer_id ON orders (customer_id);
- 分析查询语句,在经常用于
- 查询优化:
- 使用
EXPLAIN
关键字分析查询语句的执行计划,找出性能瓶颈。例如,EXPLAIN SELECT * FROM products WHERE product_name LIKE '%keyword%';
,如果发现全表扫描导致性能低下,可以优化查询条件或者创建合适的索引。 - 避免使用子查询嵌套过深,尽量使用
JOIN
替代子查询,因为JOIN
通常在执行效率上更高。
- 使用
- 缓存机制:
- 可以在应用层引入缓存,如Redis。对于频繁查询且不经常变化的数据,先从缓存中获取数据。如果缓存中不存在,则查询MySQL数据库,并将查询结果存入缓存。这样可以减轻MySQL的查询压力,特别是在面对DDOS导致的高并发查询时,缓存可以有效降低数据库负载。