-
第一范式:强调的是列的原子性,即数据库表的每一列都是不可分割的;
-
第二范式:在第一范式的基础之上,消除了非主属性对于码的部分函数依赖。
-
第三范式:在第二范式的基础之上,消除了非主属性对于码的传递函数依赖 。
- 原子性(A):事务是不可分割的最小操作单元,要么全部成功,要么全部失败
- 一致性(C):执行事务前后,所有的数据都保持一致状态
- 隔离性(I):并发访问数据库时,一个用户的事务不被其他事务所干扰
- 持久性(D):一个事务被提交之后,它对数据库中数据的改变是永久的
- 脏读:一个事务读到另一个还没有提交的数据
- 不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同
- 幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了“幻影”。
说说事务隔离级别?
| 隔离级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| READ-UNCOMMITTED 未提交读 | √ | √ | √ |
| READ-COMMITTED 提交读 | × | √ | √ |
| REPEATABLE-READ (默认) 可重复读 | × | × | √ |
| SERIALIZABLE 串行化 | × | × | × |
索引是帮助MySQL高效获取数据的数据结构。使用索引是为了提高查询效率,避免全表扫描。
注:问题较为广泛,可再扩充回答,比如再说说索引的分类,或者其他的。
索引的分类从物理存储角度,分为:
- 聚集(聚簇)索引
- 非聚集索引
从逻辑角度分为
- 普通索引
- 唯一索引
- 主键索引
- 联合索引
- 全文索引
从数据结构角度分
- B树索引
- B+树索引
- Hash索引
- 在索引列上进行运算操作
- 字符串类型字段使用时不加引号
- 如果仅仅是尾部模糊匹配,索引不会失效。如果是头部模糊匹配,索引失效
- 用 or 连接的查询条件,如果 or 前的条件中的列有索引,而后面的列中没有索引,索引失效
- 如果 MySQL 评估使用索引比全表扫描更慢,则不使用索引
可以,MySQL有索引合并机制,对同一个表可以使用多个索引分别进行条件扫描,然后将结果进行合并处理,最后再进行回表查询。这些需要合并的索引只能是一个表的,不能对多表进行索引合并。
有三种合并方式:
- 取交集
- 取并集
- 取有序并集
你有索引index1(a,b,c),这是联合索引,也叫复合索引、多列索引;
你有索引index2(a),index3(b),index4(c),然后你的sql中有and、or或union之类的条件对三个索引分别进行条件扫描,然后将各自的结果进行合并,这叫索引合并,这时你用explain查看执行计划会看到有“index merge”字样。
至于两者有没有关系,这怎么讲呢,一般来说,联合索引(复合索引)的效率要比索引合并要高,在能使用联合索引时尽量使用联合索引,当然这要根据具体情况,sql中寸在“or”这样的连接词时,那就可能必须要使用索引合并了。
索引是不越多越好?不是。创建索引和维护索引都是需要消耗性能的,索引越多维护成本越高。例如:当对表中的数据进行增删改的时候,如果数据有索引,那么索引也需要修改,会降低效率。
一般情况下:
- 数据量小的表不需要建立索引
- 不经常使用的列不要建立索引
- 经常频繁更新的列不要建立索引,因为肯定会影响插入或更新的效率
在老版本中默认的存储引擎是 MyISAM,当前MySQL默认存储引擎是 InnoDB
区别:
- MyISAM 只有表级锁,而 InnoDB 支持行级锁 和 表级锁,默认为行级锁。
- MyISAM 不支持外键,而 InnoDB 支持。
- MyISAM 不支持事务,而 InnoDB 支持事务。
优化可以从很多方面来讲:如SQL语句、有效索引、数据结构、系统配置、硬件
- SQL语句以及索引的优化是最关键的。首先要根据需求写出结构良好的SQL,然后根据SQL在表中建立有效索引。具体点比如覆盖索引、前缀字段采用选择性高的
- 根据数据库范式来进行表结构设计,设计时要考虑如何让查询更加有效。比如选择可存下数据的最小的、简单的数据类型。
- 系统配置的优化。MySQL数据库是基于文件的,如果打开的文件数达到一定的数量,无法打开之后就会进行频繁的IO操作。
- 硬件优化。更快的IO、更多的内存。



