面试题答案
一键面试字符串类型选择
- VARCHAR:由于字符串平均长度50个字符,且长度可变,
VARCHAR
是较好选择。VARCHAR
类型根据实际存储内容长度动态分配空间,相比固定长度的CHAR
类型,在存储短字符串时能节省空间。MySQL底层存储VARCHAR
时,除了存储实际字符内容外,还会额外使用1 - 2个字节存储字符串长度(当列的最大长度小于或等于255字节时,使用1个字节;否则使用2个字节)。 - 避免TEXT类型:虽然
TEXT
类型也能存储变长字符串,但它通常用于存储较长文本,且在MySQL底层存储时与VARCHAR
有区别。TEXT
类型存储的数据会单独存放在一个独立的区域,而不是像VARCHAR
那样与其他列数据存储在一起,这可能导致在高并发读写时额外的I/O开销。
字符集设置
- UTF8MB4:为了支持表情符号和多国语言文字,应选择
UTF8MB4
字符集。MySQL中的UTF8
实际上是UTF8MB3
,最多只能用3个字节表示一个字符,无法支持表情符号等4字节字符。而UTF8MB4
每个字符最多占用4个字节,可以完整支持这些特殊字符。从MySQL底层存储角度看,不同字符集在存储字符时占用的字节数不同,选择合适的字符集能确保数据准确存储且避免因字符集转换带来的性能损耗。例如,一个表情符号在UTF8MB3
下无法正确存储,若强制转换可能导致数据丢失或乱码,而在UTF8MB4
中则可正常存储。 - 字符集排序规则:配合
UTF8MB4
字符集,可选择合适的排序规则,如utf8mb4_unicode_ci
,它对多国语言支持较好且在比较和排序操作上有较好性能。排序规则影响着字符串的比较和排序方式,在底层存储中,不同排序规则对数据的处理逻辑不同,合适的排序规则能提高查询时的比较效率。
数据库架构层面优化
- 分表:随着数据量增大,一张表存储所有数据会导致读写性能下降。可按一定规则(如按时间、ID范围等)进行分表。例如,按月份将数据分表存储,这样在查询特定时间段数据时,只需访问对应的表,减少了单次查询的数据量,提高查询效率。从MySQL底层看,分表后每个表的数据量相对较小,索引的维护和查询都会更高效,I/O操作也更集中在较小的数据块上。
- 索引优化:为经常查询的字段建立索引。由于是短字符串,适合使用普通索引。索引在MySQL底层以B - Tree结构存储,通过索引可以快速定位到符合条件的数据行,大大减少全表扫描的概率。例如,如果经常根据某个包含特殊字符的字段进行查询,对该字段建立索引后,查询时可以直接通过索引定位到对应数据,而无需逐行扫描整个表。但要注意索引并非越多越好,过多索引会增加写操作的开销,因为每次写入数据时都需要更新索引。
- 读写分离:在高并发读写环境下,将读操作和写操作分离到不同的数据库服务器。主库负责写操作,从库负责读操作。从库可以设置多个,通过主从复制机制保持数据同步。这样可以分散读压力,提高整体系统的并发处理能力。在MySQL底层,主从复制通过二进制日志(Binlog)来实现,主库将写操作记录到Binlog中,从库通过I/O线程读取Binlog并应用到自身数据库,从而实现数据同步。