MySQL面试题
-
MySQL 中 varchar 与 char 的区别?varchar(50) 中的 50 代表的涵义?
1、varchar 与 char 的区别,char 是一种固定长度的类型,varchar 则是一种可变长度的类型。
2、varchar(50) 中 50 的涵义最多存放 50 个字符。。varchar(50) 和 (200) 存储 hello 所占空间一样,但后者在排序时会消耗更多内存,因为 ORDER BY col 采用 fixed_length 计算 col 长度(memory引擎也一样)。所以,实际场景下,选择合适的 varchar 长度还是有必要的。 -
int(11) 中的 11 代表什么涵义?
int(11) 中的 11 ,不影响字段存储的范围,只影响展示效果。
(MyISAM 读音:“麦怎” “my-z[ei]m” 。。InnoDB 拆开读 in-no-db ) -
MyISAM和InnoDB区别(MySQL 5.5版本后默认的存储引擎为InnoDB(事务性数据库引擎))
- InnoDB支持事务,MyISAM不支持;
- InnoDB数据存储在共享表空间,MyISAM数据存储在文件中;
- InnoDB支持行级锁,MyISAM只支持表锁;
- InnoDB支持崩溃后的恢复,MyISAM不支持;
- InnoDB支持外键,MyISAM不支持。
MyISAM 相对简单,所以在效率上要优于 InnoDB,小型应用可以考虑使用 MyISAM。
MyISAM 表是保存成文件的形式,在跨平台的数据转移中使用 MyISAM 存储会省去不少的麻烦。
应用场景:
MyISAM 管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的 SELECT 查询,那么 MyISAM 是更好的选择。
InnoDB 用于事务处理应用程序,具有众多特性,包括 ACID 事务支持。如果应用中需要执行大量的 INSERT 或 UPDATE 操作,则应该使用 InnoDB,这样可以提高多用户并发操作的性能。
-
SQL查询的效率:
1、避免 * 全表扫描: 直接列出需要查询的字段
2、避免 != 和 <> 操作符,否则引擎将放弃索引进行全表扫描
3、避免在 where 子句中使用 or 来连接条件,会进行全表扫描: 例如:SELECT * FROM table WHERE a = ‘top’ OR b < 99
4、避免在 where 条件后面带表达式计算,否则引擎将放弃索引进行全表扫描: 例如:SELECT * FROM table WHERE sal/2=1000;
5、用 Like 进行模糊搜索时,%前置搜索,会使索引失效: 仅有MySQL会失效。例:like ‘%xx’。
6、使用limit子句限制返回的数据行数 -
为什么MySQL不推荐使用UUID或雪花ID作为主键ID:
自增ID:自增的主键的值是顺序的,所以Innodb把每一条记录都存储在一条记录的后面。当达到页面的最大填充因子时候(innodb默认的最大填充因子是页大小的15/16,会留出1/16的空间留作以后的 修改)。效率快,但会高并发锁争用。
UUID:因为uuid相对顺序的自增id来说是毫无规律可言的,新行的值不一定要比之前的主键的值要大,所以innodb无法做到总是把新行插入到索引的最后,而是需要为新行寻找新的合适的位置从而来分配新的空间。无序效率慢。 -
乐观锁和悲观锁区别:
乐观锁:先进行业务操作,不到万不得已不去拿锁。即“乐观”的认为拿锁多半是会成功的,因此在进行完业务操作需要实际更新数据的最后一步再去拿一下锁就好。
悲观锁:悲观锁的特点是先获取锁,再进行业务操作,即“悲观”的认为获取锁是非常有可能失败的,因此要先确保获取锁成功再进行业务操作。 -
数据库的索引有什么作用?
优点: 1、提高数据的检索速度,降低数据库IO成本:使用索引的意义就是通过缩小表中需要查询的记录的数目从而加快搜索的速度。
2、降低数据排序的成本,降低CPU消耗:索引之所以查的快,是因为先将数据排好序,若该字段正好需要排序,则正好降低了排序的成本。
缺点: 1、占用存储空间:索引实际上也是一张表,记录了主键与索引字段,一般以索引文件的形式存储在磁盘上。
2、降低更新表的速度:表的数据发生了变化,对应的索引也需要一起变更,从而减低的更新速度。否则索引指向的物理数据可能不对,这也是索引失效的原因之一。
3、索引在以下情况不适用: a. 少量数据,b.频繁更新的字段,c.很少使用的字段 -
左关联、右关联、内关联查询的区别
- 左关联:在 LEFT JOIN 左边 的表里面数据全被全部查出来,右边的数据只会查出符合ON后面的符合条件的数据,不符合的会用NULL代替。
- 右关联:RIGHT JOIN 右边 的表里面数据全被全部查出来,右边的数据只会查出符合ON后面的符合条件的数据,不符合的会用NULL代替。
- 内关联:INNER JOIN 相当于左连接与右连接的 合并,去掉所有含NULL的数据行,剩下的就是查询出来的数据了。其实就是两边的表都必须满足条件。