没有合适的资源?快使用搜索试试~ 我知道了~
mysql面试题100题
资源推荐
资源详情
资源评论
1. MySQL 有哪些数据类型?
数值类型
整数类型:TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,分别表示 1 字节、2 字节、3
字节、4 字节、8 字节
1)任何整数类型都可以加上 UNSIGNED 属性,表示无符号整数。
2)任何整数类型都可以指定长度,但它不会限制数据的合法长度,仅仅限制了显示长度
。
小数类型:FLOAT、DOUBLE、DECIMAL
字符串类型:VARCHAR、CHAR、TEXT、BLOB。
注意:VARCHAR(n) 和 CHAR(n) 中的 n 并不代表字节个数,而是代表字符的个数。
日期和时间类型:DATETIME、DATE 和 TIMESTAMP。
尽量使用 TIMESTAMP,空间效率高于 DATETIME。
2. CHAR 和 VARCHAR 区别?
1)首先可以明确的是 CHAR 是定长的,而 VARCHAR 是可以变长。
CHAR 会根据声明的字符串长度分配空间,并会使用空格对字符串右边进行尾部填充。所以在检索
CHAR 类型数据时尾部空格会被删除,如保存的是字符串 'char ',但最后查询到的是 'char'。又因为
长度固定,所以存储效率高于 VARCHAR 类型。
VARCHAR 在 MySQL 5.0 之后长度支持到 65535 字节,但会在数据开头使用额外 1~2 个字节存储字符
串长度(列长度小于 255 字节时使用 1 字节表示,否则 2 字节),在结尾使用 1 字节表示字符串结
束。
2)再者,在存储方式上,CHAR 对英文字符(ASCII)占用 1 字节,对一个汉字使用用 2 字节。而
VARCHAR 对每个字符均使用 2 字节。
虽然 VARCHAR 是根据字符串长度分配存储空间的,但在内存中依旧使用声明长度进行排序等作业
,故在使用时仍需综合考量字段长度。
3. CHAR 和 VARCHAR 如何选择?
1)对于经常变更的数据来说,CHAR 比 VARCHAR 更好,因为 CHAR 不容易产生碎片。
2)对于非常短的列或固定长度的数据(如 MD5),CHAR 比 VARCHAR 在存储空间上更有效率。
4)使用时要注意只分配需要的空间,更长的列排序时会消耗更多内存。
4)尽量避免使用 TEXT/BLOB 类型,查询时会使用临时表,导致严重的性能开销。
4、CHAR,VARCHAR 和 Text 的区别?
1)长度区别
Char 范围是 0~255。
Varchar 最长是 64k(注意这里的 64k 是整个 row 的长度,要考虑到其它的 column,还有如果存在
not null 的时候也会占用一位,对不同的字符集,有效长度还不一样,比如 utf-8 的,最多 21845,
还要除去别的 column),但 Varchar 在一般情况下存储都够用了。
如果遇到了大文本,考虑使用 Text,最大能到 4G(其中 TEXT 长度 65,535 bytes ,约 64kb ;
MEDIUMTEXT 长度 16,777,215 bytes,约 16 Mb;而 LONGTEXT 长度 4,294,967,295 bytes,约 4Gb)
。
2)效率区别
效率来说基本是 Char > Varchar > Text,但是如果使用的是 Innodb 引擎的话,推荐使用 Varchar 代替
Char。
3)默认值区别
Char 和 Varchar 支持设置默认值,而 Text 不能指定默认值。
5、什么是三大范式?
第一范式(1NF):字段(或属性)是不可分割的最小单元,即不会有重复的列,体现原子性
第二范式(2NF):满足 1NF 前提下,存在一个候选码,非主属性全部依赖该候选码,即存在主键
,体现唯一性,专业术语则是消除部分函数依赖
第三范式(3NF):满足 2NF 前提下,非主属性必须互不依赖,消除传递依赖
6、索引的几种类型或分类?
1)从物理结构上可以分为聚簇索引和非聚簇索引两类:
聚簇索引指索引的键值的逻辑顺序与表中相应行的物理顺序一致,即每张表只能有一个聚
簇索引,也就是我们常说的主键索引;
非聚簇索引的逻辑顺序则与数据行的物理顺序不一致。
2)从应用上可以划分为以下几类:
普通索引:MySQL 中的基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值
,纯粹为了提高查询效率。通过 ALTER TABLE table_name ADD INDEX index_name (column) 创建;
唯一索引:索引列中的值必须是唯一的,但是允许为空值。通过 ALTER TABLE table_name ADD
UNIQUE index_name (column) 创建;
主键索引:特殊的唯一索引,也称聚簇索引,不允许有空值,并由数据库帮我们自动创建;
组合索引:组合表中多个字段创建的索引,遵守最左前缀匹配规则;
全文索引:只有在 MyISAM 引擎上才能使用,同时只支持 CHAR、VARCHAR、TEXT 类型字段上使用
。
7、索引的优缺点?
先来说说优点:创建索引可以大大提高系统的性能。
通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
既然增加索引有如此多的优点,为什么不对表中的每一个列都创建一个索引呢?这是因为索引也
是有缺点的:
创建和维护索引需要耗费时间,这种时间随着数据量的增加而增加,这样就降低了数据的维护速
度。
索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间。如果要
建立聚簇索引,那么需要的空间就会更大。
8、索引设计原则?
选择唯一性索引:
唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录。
为常作为查询条件的字段建立索引:
如果某个字段经常用来做查询条件,那么该字段的查询速度会影响整个表的查询速度。因此,为
这样的字段建立索引,可以提高整个表的查询速度。
为经常需要排序、分组和联合操作的字段建立索引:
经常需要 ORDER BY、GROUP BY、DISTINCT 和 UNION 等操作的字段,排序操作会浪费很多时间。如
果为其建立索引,可以有效地避免排序操作。
限制索引的数目:
每个索引都需要占�用磁盘空间,索引越多,需要的磁盘空间就越大,修改表时,对索引的重构
和更新很麻烦。
小表不建议索引(如数量级在百万以内):
由于数据较小,查询花费的时间可能比遍历索引的时间还要短,索引可能不会产生优化效果。
尽量使用数据量少的索引:
如果索引的值很长,那么查询的速度会受到影响。此时尽量使用前缀索引。
删除不再使用或者很少使用的索引。
9、索引的数据结构?
索引的数据结构和具体存储引擎的实现有关,MySQL 中常用的是 Hash 和 B+ 树索引。
Hash 索引底层就是 Hash 表,进行查询时调用 Hash 函数获取到相应的键值(对应地址),然后回
表查询获得实际数据.
B+ 树索引底层实现原理是多路平衡查找树,对于每一次的查询都是从根节点出发,查询到叶子节
点方可以获得所查键值,最后查询判断是否需要回表查询.
10、Hash 和 B+ 树索引的区别?
Hash
1)Hash 进行等值查询更快,但无法进行范围查询。因为经过 Hash 函数建立索引之后,索引的顺
序与原顺序无法保持一致,故不能支持范围查询。同理,也不支持使用索引进行排序。
2)Hash 不支持模糊查询以及多列索引的最左前缀匹配,因为 Hash 函数的值不可预测,如 AA 和 AB
的算出的值没有相关性。
3)Hash 任何时候都避免不了回表查询数据.
4)虽然在等值上查询效率高,但性能不稳定,因为当某个键值存在大量重复时,产生 Hash 碰撞,
此时查询效率反而可能降低。
B+ Tree
1)B+ 树本质是一棵查找树,自然支持范围查询和排序。
2)在符合某些条件(聚簇索引、覆盖索引等)时候可以只通过索引完成查询,不需要回表。
3)查询效率比较稳定,因为每次查询都是从根节点到叶子节点,且为树的高度。
11、为何使用 B+ 树而非二叉查找树做索引?
剩余22页未读,继续阅读
资源评论
felin7
- 粉丝: 1374
- 资源: 40
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功