java面试题准备
mysql
MySQL优化
优化顺序的核心逻辑:
从 “不改变架构、低成本见效” 到 “调整架构、高成本投入”,逐步解决问题:
1. 先用最小可行类型对字段类型进行处理:比如状态字段用 TINYINT(0-255)而非 INT,手机号用 CHAR(11) 而非 VARCHAR(固定长度更高效),时间用 DATETIME/TIMESTAMP 而非字符串;
2. 再对大字段冗余进行处理:比如长文本(如文章内容、JSON 数据)拆到子表,主表仅保留查询高频字段(ID、标题、时间等);
3. 默认值用空字符串(文本)或 0(数字)来代替NULL;
4. 对高频查询条件创建索引或联合索引、清除冗余索引、控制索引数量;
5. 开启慢查询日志和用 EXPLAIN 分析 SQL来获取低效语句及其信息,
6. 再通过避免 SELECT *、减少 JOIN 表数量、避免 OR 和 NOT IN来进行SQL语句优化
7. 优化 MySQL 关于内存、写入性能、并发控制的配置;
8. 用主库负责写入、从库负责查询,通过 MySQL 主从复制同步数据;
9. 用 Redis 缓存高频查询结果,设置合理过期时间;
10. 优化磁盘、内存、CPU、网络
记录货币用什么字段类型好
推荐方案:使用 DECIMAL 类型
DECIMAL 是定点数类型,能够精确存储小数,适合表示货币等需要高精度的数据。
CHAR 和VARCHAR 的区别
在数据库中,CHAR 和 VARCHAR 都是用于存储字符串类型数据的字段类型;
1. 存储方式
CHAR(n):固定长度存储。即使实际存储的字符串长度小于定义的 n,也会占用 n 个字符的存储空间(不足的部分会用空格填充)。
VARCHAR(n):可变长度存储。仅占用实际字符串长度 + 1-2 个字节(用于记录字符串长度)的存储空间,不会浪费额外空间。
2. 长度限制
两者通常都需要指定一个最大长度 n(不同数据库的最大值可能不同,如 MySQL 中最大为 65535)。
CHAR(n) 中 n 表示固定占用的字符数;VARCHAR(n) 中 n 表示允许存储的最大字符数。
3. 性能差异
CHAR 由于长度固定,读取和写入速度更快,适合存储长度固定的数据(如身份证号、手机号、性别等)。
VARCHAR 由于长度可变,需要额外计算长度,性能略低,但能节省存储空间,适合存储长度不固定的数据(如姓名、地址、描述等)。
4. 空格处理
CHAR 会自动去除尾部的空格(部分数据库行为);VARCHAR 会保留尾部的空格。CHAR 的自动去空格:保障固定格式数据的一致性;VARCHAR 的保留空格:精确存储原始输入的意义。