本帖最后由 执迷不悟 于 2020-3-18 11:37 编辑
mysql面试题
1.事务的基本特征 原子性(atomicity):一个事务必须视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性。 一致性(consistency):数据库总数从一个一致性的状态转换到另一个一致性的状态。 隔离性(isolation):一个事务所做的修改在最终提交以前,对其他事务是不可见的。 持久性(durability):一旦事务提交,则其所做的修改就会永久保存到数据库中。此时即使系统崩溃,修改的数据也不会丢失。 2.事务的隔离级别,mysql默认的隔离级别是什么? 读未提交(Read uncommitted),一个事务可以读取另一个未提交事务的数据,最低级别,任何情况都无法保证。 读已提交(Read committed),一个事务要等另一个事务提交后才能读取数据,可避免脏读的发生。 可重复读(Repeatable read),就是在开始读取数据(事务开启)时,不再允许修改操作,可避免脏读、不可重复读的发生。 串行(Serializable),是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。Mysql的默认隔离级别是Repeatable read。 3.说一说脏读、不可重复读、幻读 脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据; 不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果因此本事务先后两次读到的数据结果会不一致; 幻读:幻读解决了不重复读,保证了同一个事务里,查询的结果都是事务开始时的状态(一致性); 4、MySQL主要的索引类型 普通索引:是最基本的索引,它没有任何限制; 唯一索引:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一; 主键索引:是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值; 组合索引:指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用组合索引时遵循最左前缀集合;最左原则 全文索引:主要用来查找文本中的关键字,而不是直接与索引中的值相比较,mysql中MyISAM支持全文索引而InnoDB不支持(5.6之后的mysql中,InnoDB引擎也支持全文索引);
5.数据库三大范式 第一范式:数据库表中的字段都是单一属性的,不可再分(保持数据的原子性); 第二范式:第二范式必须符合第一范式,非主属性必须完全依赖于主键。 第三范式:在满足第二范式的基础上,在实体中不存在其他实体中的非主键属性,传递函数依赖于主键属性,确保数据表中的每一列数据都和主键直接相关,而不能间接相关(表中字段[非主键]不存在对主键的传递依赖)
6.sql语句分类: DDl,DML,DQL,DCL
7.索引的作用?和它的优点缺点是什么? 提高查询效率, 优点: 查询效率高, 降低数据IO成本, 降低数据排序CPU消耗 缺点: 占用磁盘空间, 新增,删除, 修改----> 慢, 因为需要修改索引
8.说几个mysql中你常用的函数 limit、order by、between、group by;
9. 使用like 'a%' 、like'%a'、like'%a%'查询时是否会使用索引 'a%'会,其他两个不会
mysql 优化为什么要优化 ? 在少量数据的情况下,一般不会涉及到性能问题,当我们数据量变多,达到几百万上千万时候,会明显感觉到一些复杂查询执行效率缓慢,一条sql可能需要执行好几秒,为了用户体验的良好以及系统运行的流畅,我们需要进行sql优化,使我们的程序执行更快 优化由谁参与 在进行数据库优化时,应由数据库管理员、业务部门代表、应用程序架构师、应用程序设计人员、应用程序开发人员、硬件及系统管理员、存储管理员等,业务相关人员共同参与。 优化选择 1) 优化成本: 硬件>系统配置>数据库表结构>SQL及索引 2) 优化效果: 硬件<系统配置<数据库表结构<sql及索引 sql语句优化避免使用 select * , 因为在执行过程中, 首先要把* 解析成字段,然后进行查询, 影响效率
可以写成: select name from t where id=?;
尽量避免在where 子句中使用 != 或 <> 操作符, 否则将导致mysql放弃使用索引, 而进行全表扫描 如: select id from t where num !=null; 下面的查询也将导致全表扫描: select id from t where name like '%abc%' select id from t where name like '%abc' 使用 select id from t where name like 'abc%' 索引不会失效 尽量避免在 where 子句中对字段进行 null 值判断, 否则将有可能导致mysql放弃使用索引, 而进行全表扫描 如: select id from t where num is not null 可以在num 上设置默认值0, 确保表中num列没有null 出现, 然后查询语句可以这样写 select id from t where num=0; 尽量避免在 where子句中使用 or 来连接条件, 否则将有可能导致mysql放弃使用索引, 而进行全表扫描 如: select id from t where num=10 or num=20 可以这样写 select id from t where num=10 union all select id from t where num=20 in 和 not in 也要慎用, 否则有可能会导致全表扫描 select id from t where num in(1,2,3) 对于连续的数值, 我们能用between 就不需要使用 in 了 select id from t where num between 1 and 3 尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。 这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。 比如: sex 0, 1 尽可能的使用 char 代替 varchar ,因为首先变长字段存储空间小,可以节省存储空间, 其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。 Char:定长,效率高,一般用于固定长度的表单提交数据存储 ;例如:身份证号,手机号,电话,密码等 varchar:不定长,效率偏低,节约空间
|