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的行。这种用法可以用来统计去重后的结果数量。
posted @ 2021-05-07 09:58  Abserver  阅读(51)  评论(0)    收藏  举报