阅读本文大约须要 8 分钟。
数据库打算只写 MySQL,Redis 两部分,不会很细,主要以面试题为主。此次写的是 MySQL 篇。面试
这里先介绍一下数据库的概念,数据库是一种数据结构,内含多种算法,帮助咱们将数据以最优化的方式存储在计算机中,也能够帮助咱们快速找到存储的数据。算法
数据最终存储在计算机中都是以「二进制」的方式存储。好比 4,存储在计算机中实际上是以 0100 的方式存储。好比 A,存储在计算中是以 0100 0001 的方式存储。数据库
char
:定长字符型,最大可存储 255 (2 的 8 次方)个字节长度,能够理解成最大能够存储 255 个字符。在计算机中以 8 位二进制的方式存储。安全
使用char
类型存储数据时,假设存储的数据是 4,4 在计算机中存储的结果是 0000 0100,意味着使用定长字符型char
,无论你存储的值是多少位,最终在计算机里都是以 8 位二进制的方式存储,不满 8 位,前面补 0。超过 8 位,超出的部分会被去除。服务器
也就是说当使用char
字符型存储数据后,该数据转换为二进制时的长度超过了 8 位,那么该数据将不会完整存储,会「丢失」一部分数据。数据结构
varchar
:不定长字符型,最大可存储 65535(2 的 16 次方) 个字节长度,在计算机中以 16位 二进制的方式存储。并发
它与char
不一样的地方在于,当字符长度在 0-255 之内时,会在后面添加一个字节,超过 255 时,添加两个字节。一样的,当超过最大存储长度后,也会丢失一部分数据。函数
text
:长文本数据类型,最大可存储 65555 个字节长度,不能指定长度,也就是说不支持text(num)
。高并发
可是该类型尽可能不要使用,由于text
类型数据在检索中,不会使用索引,而是使用全局搜索,这会产生临时表,使得检索时间变长,不推荐使用。性能
因为char
和varchar
的特性,在实际使用当中,若是该数据是常常会发生变化、常用的,那么推荐使用char
类型,由于 MySQL 在对数据进行排序时,会根据该数据的长度来排,固定长度的char
类型会提供更高的性能。可是因为固定长度的特性,在存储短数据时,必定程度上也会形成资源浪费,算是一个双刃剑。
100 只是在呈现角度上定义的,好比该数据有 120 个字符,那么你在查询该数据时,看到的只有 100 个。可是若是在定义时,添加了UNSIGNED ZEROFILL
属性,那么这将改变该类型的最大存储长度。
一样的,在实际使用当中,varchar(num)
里的值不须要定义的特别长,只要够用就行,具体缘由上面有提,这里再也不赘述。
DORP
:非事务操做,完全删除一张表,没法反悔恢复。
DELETE
:事务操做,删除表里的一行或多行数据,若是反悔或是误删,能够经过「事务回滚」恢复该表。不会影响该表下的view
或索引。
TRUNCATE
:非事务操做,删除表里的某行数据,或是删除整张表的数据(表依然存在,只是成了一张空表)。没法反悔恢复,而且会将该表下的view
或索引重置。
执行速度:DROP > TRUNCATE > DELETE。
第一范式:表中的字段只能表达一种意思,不能模棱两可。
第二范式:表必须含有一个惟一主键来标识这张表。
第三范式:表中的字段不能互相依赖。
Scale Out(垂直切分)
Scale Up(横向拆分)
这里有篇文章值得看一看。MySQL 分区、分表
若是把数据库当作一本书的话, 那么索引就是书的「目录页」,经过目录,咱们能够快速定位查找内容,一样的,目录页在书中也占了一页纸,因此索引是一个数据结构,也要占据数据库物理内存。
索引分为 4 种类型:普通索引、惟一索引、主键索引和全文索引(MyISAM 专有)。
索引的建立规则:常用的字段名,和出如今 where 后面的字段名,建议为它们建立索引,索引要遵循最左前缀原则(最能体现该索引特征,也就是经常使用的字段放最左边)。
索引的原理:能够看看这篇文章。索引
索引的使用场景:中等、大量数据时,使用索引效率会很是高,小型数据不建议使用索引,没有全局搜索来的快。
索引的做用:索引能够提升查询速度。可是索引会增长数据库存储额外开销。索引会将数据库查询时的随机 I/O 变成顺序 I/O,减小服务器排序操做,和临时表的开销。
EXPLAIN
查看 SQL 执行计划,帮助本身查看哪些地方能够优化。SELECT * FROM xxx
这种查询语句,须要什么就查什么。text
这种类型,这会使得数据查询该字段时,建立临时表。LIMIT
,为查询结果限制显示页数。EXISTS
和BETWEEN
代替IN
。WHERE
中使用表达式操做,这会使得 MySQL 放弃使用索引查询。INNER JOIN
而不是LEFT JOIN
,由于前者默认使用小表驱动大表。LIKE
。NULL
属性,在对NULL
进行判断时,会使得 MySQL 放弃使用索引。COUNT(*)
时,速度远高于 InnoDB。InnoDB 引擎下,MySQL 支持事务操做,事务拥有如下几个特色:
使用事务的操做,要么执行,要么不执行,只有一个结果,可是事务能够回滚,也就是撤回操做。
InnoDB 引擎下的 MySQL 在处理高并发时,会对 MySQL 数据库添加锁机制,以此完成并发的要求,并保证数据的完整性,可靠性。
悲观锁是 MySQL 为数据库添加行锁,强行为多个事务排序,阻塞事务运行,解决事务之间的冲突问题,可是事务之间有可能出现长时间等待,且开锁、解锁须要额外的数据库资源消耗。因此要谨慎使用。
乐观锁没有锁机制,可是引入了版本号控制,在高并发时,数据库在事务提交以前会进行版本号校验,若是版本后先后不一致,说明此刻有其余事务正在操做,那么本次事务从新操做。
版本号的好处在于没有锁的开销,而且只在事务最后提交更改时进行判断,可是也要考虑从新执行的代价是否过大。
总的来讲,高并发下,读操做多的时候,使用乐观锁,写的操做时,使用悲观锁。
未更完,下次更新补上。