1. mysql中的数据类型有哪些?每种数据类型占多少字节?
-
数值类型:
- TINYINT:占用1个字节,有符号范围是-128到127,无符号范围是0到255。
- SMALLINT:占用2个字节,有符号范围是-32768到32767,无符号范围是0到65535。
- MEDIUMINT:占用3个字节,有符号范围大约是-8388608到8388607。
- INT或INTEGER:占用4个字节,有符号范围是-2147483648到2147483647。
- BIGINT:占用8个字节,有符号范围是大约-9223372036854775808到9223372036854775807。
-
浮点数和定点数类型:
- FLOAT:占用4个字节,单精度浮点数。
- DOUBLE或DOUBLE PRECISION:占用8个字节,双精度浮点数。
- DECIMAL(M, D) 或 NUMERIC(M, D):实际占用的字节数取决于M(总有效数字位数)和D(小数点后的位数),计算方法通常是 (M+2)*(D+1)/2 + 1 字节(当M <= 9时,若M > 9则按实际规则计算存储空间)。
-
日期和时间类型:
- YEAR:占用1个字节,存储年份。
- TIME:占用3、4或8个字节,根据精度不同。
- DATE:占用3个字节,存储日期信息。
- DATETIME:占用8个字节,存储日期和时间信息。
- TIMESTAMP:占用4或7个字节,存储时间戳,依赖于MySQL版本和配置。
-
字符串类型:
- CHAR(M):固定长度,占用M字节,1 <= M <= 255,对于多字节字符集如UTF-8,每个字符可能会占用多个字节。
- VARCHAR(M):变长字符串,占用L+1字节,L是实际字符长度,1 <= L <= M且1 <= M <= 255,在UTF-8编码下,每个字符仍然可能占用多个字节。
- TINYBLOB/TINYTEXT:实际内容加1字节,内容长度小于2^8字节。
- BLOB/TEXT:实际内容加2字节,内容长度小于2^16字节。
- MEDIUMBLOB/MEDIUMTEXT:实际内容加3字节,内容长度小于2^24字节。
- LONGBLOB/LONGTEXT:实际内容加4字节,内容长度小于2^32字节。
- ENUM:存储枚举值,每个枚举值占用1或2个字节,取决于枚举值的数量(最多65535个)。
- SET:存储集合,占用字节数由集合内元素数量决定,可以是1、2、3、4或8个字节,最大成员数为64。
2. mysql中,一个中文字符在不同编码方式下各占多少字节?
一个中文字符在MySQL中使用不同编码方式时,通常占据的字节数如下:
- GBK:2个字节
- UTF-8:通常3个字节,极少数情况下4个字节
- UTF-16:通常2个字节,对于扩展区汉字可能是4个字节
- UTF-32:始终4个字节
- ASCII和ISO-8859-1:不支持直接存储中文字符,若强行存储,字节数不确定且可能导致乱码
3. 说说MySQL中sql的优化?explain有什么用?
- 避免全表扫描,合理使用索引;
- 减少子查询,改写为JOIN联表操作;
- 避免使用NOT IN、!=等不易利用索引的操作符;
- 适当使用覆盖索引(查询只需要从索引中获取所需列而无需访问数据行);
explain的作用:
-
查询执行计划分析:
EXPLAIN命令允许开发者查看MySQL对特定SELECT语句(以及其他支持的语句类型如DELETE、INSERT、REPLACE、UPDATE)的执行计划。这包括MySQL决定如何连接表、使用的索引、数据读取顺序、操作类型(如全表扫描、索引扫描、临时表等)以及预期的行数。
-
索引使用诊断:
EXPLAIN结果显示了MySQL是否正确地使用了已有的索引,以及是否存在未使用索引导致全表扫描的情况。如果发现预期的索引未被使用,可能需要重新审视查询语句或索引设计。
-
查询性能预测:
EXPLAIN输出提供了查询可能涉及的数据行数量(rows),有助于评估查询的潜在成本。大量的行数往往意味着较低的查询效率,可能需要进一步优化。