Mysql
1、MyISAM与InnoDB的区别
-
InnoDB 支持事务;MyISAM 不支持事务
-
InnoDB 支持行级锁;MyISAM 支持表级锁
-
InnoDB 支持 MVCC(多版本并发控制);MyISAM 不支持
-
InnoDB 支持外键,MyISAM 不支持
-
MySQL 5.6 以前的版本,InnoDB 不支持全文索引,MyISAM 支持;MySQL 5.6 及以后的版本,MyISAM 和 InnoDB 存储引擎均支持全文索引
-
InnoDB 不保存表的总行数,执行 select count(*) from table 时 需要全表扫描;MyISAM 用一个变量保存表的总行数,查总行数速度很快
-
InnoDB 是聚集索引,数据文件是和索引绑在一起的,必须要有主键, 通过主键索引效率很高。辅助索引需要两次查询,先查询到主键,再通过主键查询到数据。主键太大,其他索引也会很大;MyISAM 是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针,主键索引和辅助索引是独立的
2、char与varchar的区别
-
char是一种固定长度的字符串类型
-
varchar是一种可变长度的字符串类型
3、Mysql的六种触发器
-
Before Insert
-
After Insert
-
Before Update
-
After Update
-
Before Delete
-
After Delete
4、cmd连接、关闭Mysql
-
连接:mysql -u -p -h -P (-u:指定用户名 -p:指定密码 -h:主机 -P:端口)
-
关闭:exit或quit
5、事务的四大特性
-
原子性(Atomic):一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样
-
一致性(Consistency):在事务开始之前和事务结束以后, 数据库的完整性没有被破坏
-
隔离性(Isolation):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)
-
持久性(Durability):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失
6、MySQL中text数据类型的最大长度
-
tinytext:256bytes
-
text:65535bytes
-
mediumtext:16777215bytes(16MB)
-
longtext:4294967295bytes(4GB)
7、MySQL中datetime和timestamp的区别
-
datetime的日期范围是1001——9999年;timestamp的时间日期是1970——2038年
-
datetime存储与时区无关;timestamp存储时间与时区有关,显示的值也依赖于时区
-
datetime的存储空间为8字节;timestamp的存储空间为4字节
-
datetime的默认值为null;timestamp的字段默认不为空,默认值为当前时间(current_timestamp)
8、float和double的区别
-
float类型数据可以存储至多8位十进制数,占4字节
-
double类型数据可以存储至多18位十进制数,占8字节
9、InnoDB引擎特性
-
插入缓冲(insert buffer)
-
二次写(double write)
-
自适应哈希索引(ahi)
-
预读(read ahead)
10、索引的种类
-
普通索引
-
唯一索引
-
主键索引
-
组合索引
-
全文索引
-
覆盖索引
11、创建MySQL联合索引的注意
-
联合索引要遵从最左前缀原则,否则不会用到索引
-
Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。
-
如索引是 index (a,b,c),可以支持 a 或 a,b 或 a,b,c 3种组合进行查找,但不支持 b,c 进行查找
12、MyISAM索引与InnoDB索引的区别
-
InnoDB 索引是聚簇索引,MyISAM 索引是非聚簇索引
-
InnoDB 的主键索引的叶子节点存储着行数据,主键索引非常高效
-
MyISAM 索引的叶子节点存储的是行数据地址,需要再寻址一次才能得到数据
-
InnoDB 非主键索引的叶子节点存储的是主键和其他带索引的列数据,因此查询时做到覆盖索引会非常高效
13、索引失效的情况
-
如果条件中有or,即使其中有部分条件是索引字段,也不会使用索引
-
复合索引,查询条件不适用索引前面的字段,后续字段也去发使用索引
-
以%开头的like查询
-
索引列的数据类型存在隐形转换
-
where子句里对索引列有数学运算
-
where子句里对索引列使用函数
-
Mysql引擎估算使用全表扫描要比使用索引块,则不适用索引
14、数据库三范式及作用
-
列不可分,确保表的每一列都是不可分割的原子数据项。作用:方便字段的维护、查询效率高、易于统计。
-
属性字段完全依赖(完全依赖指不能存在仅依赖主键的部分属性)于主键。作用:保证每行数据都是按主键划分的独立数据。
-
任何非主属性字段不依赖于其它非主属性字段。作用:减少表字段与数据存储,让相互依赖的非主键字段单独成为一张关系表,记录被依赖字段即可。
三大范式只是一般设计数据库的基本理念,可以设计冗余较小、存储查询效率高的表结构。
但不能一味的去追求数据库设计范式,数据库设计应多关注需求和性能,重要程度:需求 - 性能 - 表结构。比如有时候添加一个冗余的字段可以大大提高查询性能。
15、truncate和delete的异同
-
truncate 命令永久地从表中删除所有数据;delete 命令从一个表中删除某一行或多行数据
-
truncate 和 delete 都可以将数据实体删掉,truncate 的操作并不记录到 rollback 日志,操作速度较快,删除数据不能恢复
-
delete 操作不释放表空间
-
truncate 不能对视图等进行删除;delete 可以删除单表的视图数据(本质是对表数据的删除)
-
truncate 是数据定义语言(DDL);delete 是数据操纵语言(DML)
16、delete、drop、truncate区别
-
truncate 和 delete 只删除数据,不删除表结构;drop 删除表结构
-
表空间:delete 不释放;truncate 不一定释放;oracle 数据库的 drop 将表删除到回收站,可以被彻底删除也可以被还原
-
删除数据的速度:drop > truncate > delete
-
delete 属于 DML 语言,需要事务管理,commit 之后才能生效;drop 和 truncate 属于 DDL 语言,操作立刻生效,不可回滚
-
使用场合:不再需要表时使用 drop 语句; 保留表删除所有记录用 truncate 语句; 删除部分记录用 delete 语句
-
浙公网安备 33010602011771号