cmd | 删除内容 | 语言类型 | 删除速度 |
---|---|---|---|
drop | 数据+结构 | DML(可回滚) | 快 |
truncate | 数据 | DDL(不可回滚) | 中 |
delete | 数据 | DDL(不可回滚) | 慢 |
1)表结构指表的定义与约束、索引、触发器等
2)delete语句每次从表中删除一行,并将该操作作为事务记录到日志
3)truncate释放存储数据的页来删除数据,再重新创建表
InnoDB | MyISAM | |
---|---|---|
主键 | 没有设定主键会自动生成一个6字节的主键(用户透明) | 可以无主键 |
外键支持 | √ | × |
索引类型 | 聚集索引 | 非聚集索引 |
索引位置 | 索引和数据一起存储 | 索引和数据分开存储 |
事务支持 | √ | × |
锁粒度 | 行锁 | 表锁 |
count() | 遍历表,开销大(加了where之后两者一致) | 保存了表总行数 |
1)不确定扫描范围时InnoDBy会锁定全表,InnoDB行锁是通过给索引加锁实现的,只有通过索引条件检索数据才使用行级锁。
2)Innode的唯一索引,普通索引等辅助索引(二级索引)需要两次查询,先查询到主键,通过主键在查找数据。
3)数据库操作大多是读操作考虑MyISAM,若频繁读写而且要求数据安全(崩溃恢复)考虑InnoDB
那什么时候不建议使用索引呢?
Hash索引的优势是精确查找的话,速度会更快,但
每个非叶子节点存储的索引更多,树的层级更少,查询数据更快
所有查询都到叶子节点,性能稳定
范围查找遍历叶子链表,不需要重复遍历
模式 | 描述 |
---|---|
^ | 匹配输入字符串的开始位置。 |
$ | 匹配输入字符串的结束位置。 |
. | 匹配除 "\n" 之外的任何单个字符。要匹配包括 ‘\n‘ 在内的任何字符,请使用 ‘[.\n]‘ 的模式。 |
[...] | 字符集合。匹配所包含的任意一个字符。 |
[^...] | 非字符集合。匹配未包含的任意字符。 |
[a-z] | 字符范围。匹配指定范围内的任意字符。 |
[^a-z] | 负值字符范围。匹配任何不在指定范围内的任意字符。 |
p1|p2|p3 | 匹配 p1 或 p2 或 p3。 |
* | 匹配前面的子表达式零次或多次。 |
+ | 匹配前面的子表达式一次或多次。 |
{n} | n 是一个非负整数。匹配确定的 n 次。 |
{n,m} | m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。 |
可以读到事务没提交的数据,会导致脏读
事务提交后才能读,解决了脏读,但不可重复读
事务开始后读到的数据不受其他事务影响,但仍旧幻读
所有操作流水进行,并发性能极差
数据处理过程中锁定数据,依靠数据库的锁机制实现
注意若不是索引而是全表扫描将会锁表
利用数据版本号(增加version字段)
读取时读version,更新时++version;提交更新时判断version与第一次读出是否一致,若不一致数据过期,更新作废。
加锁后其他事务可以读但不可以写
加锁后其他事务不能读也不能写
当范围查找并申请锁时,会对范围内但不存在的数据加锁以防止幻读
原文:https://www.cnblogs.com/kite97/p/13461033.html