「数据库并发可能出现的问题:」
「数据库定义的隔离级别:」
repeatable read
「可重复读(MySQL默认)」read commited
读取提交read uncommited
读取不提交serializable
串行化脏读 | 不可重复读 | 幻读 | |
---|---|---|---|
read uncommited | 是 | 是 | 是 |
read commited | 否 | 是 | 是 |
repeatable read | 否 | 否 | 是 |
serializable | 否 | 否 | 否 |
MYISAM | INNODB | |
---|---|---|
事务 | 不支持 | 支持 |
锁 | 表锁 | 行锁 |
索引 | 索引存储地址 | 索引存储数据和地址 |
全表总行数 | 不需要全表扫描 | 全表扫描 |
外键 | 不支持 | 支持 |
MyISAM
中存在一个变量存储了表的记录总数「优势:」
「劣势:」
「使用:」
「不使用:」
Innodb
支持,MyISAM
不支持。Innodb
默认会使用主键作为聚簇索引,如果不存在主键,则会将一个非空的字段作为聚簇索引,如果没有非空的字段则引擎会隐式构建一个主键。这也是为什么使用自增的字段作为主键的原因。可以获得更好的写速率。name
字段的索引,现在需要查询name='lisi'
的行记录,这个时候先在辅助索引中进行查询所对应的叶子节点。而这个叶子节点中保存了name
和该行的指针,而这个指针就是聚簇索引进行排序的字段值。Hash索引一般用来做数据变化不大的等值查询。不能排序,而且不支持范围查询。
BTree
索引,主流有两种,一种是B树,每一个叶子节点和中间节点中都存在有数据和指针;另一个是B+树,所有的数据都存储在叶子节点,中间节点也是一个索引。
这个和文件系统的磁盘读取有关系,磁盘读取的最小单位是簇,每一次读取都会将这一簇上的内容全部读取,而红黑树的两个节点并不能将簇填满,所以导致了空间浪费
B+树,多路寻找树,他可以存在很多分支,可以填满这些空间,所存储的内容更多,读取效率更快
from
-->on
-->join
-->where
--->group by
---> having
--->select
-->order by
-->limit
MySQL主要分为四层:
如果对三个字段建立联合索引,如果第二个字段没有使用索引,则第三个字段索引失效
or,is null,is not null
like
以%
开头的模糊查询explain
show profile
id
表的执行顺序;相同ID按顺序执行,不同ID的ID值越大越先执行possible_keys
;理论上使用到的索引keys
;实际使用的索引type
;查询数据使用的查询方法extra
;using filesort
文件内排序,没有使用索引排序using index
使用了覆盖索引using where
索引使用在了条件上using index condition
先过滤索引,然后再过滤where
可以设置一个SQL查询最长的等待时间,如果超过这个时间将会被记录到日志中
可以全方位的看到每一条SQL的执行情况