MySQL面试题
MySQL数据结构
为什么MySQL的索引要使用B+树而不是其它树形结构?比如B树?
B树:因为B树不管叶子节点还是非叶子节点,都会保存数据,这样导致在非叶子节点中能保存的指针数量变少(有些资料也称为扇出),指针少的情况下要保存大量数据,只能增加树的高度,导致IO操作变多,查询性能变低;
红黑树:典型的左偏红黑树属于二叉树,存储大量数据会导致树的深度过高,深度过大查找数据时会导致频繁的IO而效率低下;
AVL树(平衡二叉树)和红黑树基本都是存储在内存中才会使用的数据结构
MySQL中的字符类型
varchar与char的区别?
- char类型是固定长度的,varchar类型是可变长度的。char类型会用空格填充不足的长度,varchar类型会用额外的1到2个字节记录字符串的长度。
- char类型适合存储很短或长度近似的字符串,varchar类型适合存储长度不确定的字符串。char类型比varchar类型更节省空间和更快速地进行比较和检索,但是会占用更多的内存空间。
- char类型和varchar类型的最大长度都受到MySQL行的最大长度限制,即65535字节。char类型的最大长度是255个字符,不受字符编码的影响。varchar类型的最大长度取决于字符编码和实际字符串的长度,一般不超过65532个字符。
- char类型和varchar类型在排序和比较时都会忽略尾部的空格。因此,在插入或更新数据时,应该避免在字符串末尾添加多余的空格,如果确实有空格查询结果仍是带空格的数据,只是where条件筛选时会忽略。
- char类型和varchar类型在定义时都可以指定默认值。
可以存储的中文字符数量?
取决于MySQL的字符集。
- 字符集是UTF-8,一个中文汉字占用3个字节
- 字符集是GBK,一个中文汉字占用2个字节
- 字符集是UTF-8MB4,一个中文汉字占用4个字节
count的各种使用方式的差异?
- count(1)和count()都表示统计表中的所有行数,不会忽略列值为NULL的行。两者在MySQL中没有性能差别,都会进行优化。但是count()是SQL92定义的标准语法,建议使用。
- count(列)表示统计表中指定列的非NULL值的行数,会忽略列值为NULL的行。如果指定列是主键,那么count(列)会比count(1)或count()快。如果指定列不是主键,那么count(列)会比count(1)或count()慢。
- count(distinct expr)表示统计表中指定表达式的不同非NULL值的个数,会忽略表达式值为NULL的行。这种用法可以用来统计去重后的结果数量。

浙公网安备 33010602011771号