Innodb 支持行锁/表锁,支持事物,支持外键,不支持全文索引 【很多企业默认使用Innodb】
MyIsam 不支持行锁/支持表锁,不支持外键,不支持事物 ,支持全文索引
原子性(Atomicity): 一个事物所有操作全部完成或失败
一致性(Consistency): 事务开始和结束之后完整性没有被破坏
隔离性(Isolation): 允许多个事物同时对数据库修改和读写
永久性(Durablity): 事物提交之后,修改之后是永久不丢失的
按数据结构分类可分为:B+tree索引、Hash索引、Full-text索引。
按物理存储分类可分为:聚簇索引、二级索引(辅助索引)。
按字段特性分类可分为:主键索引、普通索引、前缀索引。
按字段个数分类可分为:单列索引、联合索引(复合索引、组合索引)
MySQL索引有哪些分类,你真的清楚吗? - SegmentFault 思否
总体划分为两类,主键索引也被称为聚簇索引(clustered index),其余都称呼为非主键索引也被称为二级索引(secondary index)。
主键索引存储了整行数据,而非主键索引中存储的值为主键id,当查询的值在非主键索引树里面找不到的时候就会触发回表操作。
BTree结构
B+Tree结构
当在一个索引树查询不到完整数据的情况,需要再次查找其他索引树的情况称为回表
什么时候会使用回表操作,当使用的是非主键索引的时候,就会进行会表操作操作
如何避免回表操作:使用覆盖索引
只需要在一棵索引树上就能获取SQL所需的所有列数据,无需回表
将被查询的字段,建立到联合索引里去。
使用or
聚合索引没有遵循最左匹配
like 查询 %再在前面
在查询的字段选择函数计算
使用 != , <>
一张图搞懂MySQL的索引失效 - SegmentFault 思否
limit offset 执行过程是读取n行数据然后抛弃前面的数据,这样数据量大速度就会变慢,所以需要通过引入主键索引 或者 给需要查询的字段增加索引
这句 SQL 的执行逻辑是
百万级表Limit翻页越往后越慢咋办? - 云+社区 - 腾讯云
SQL注入的攻击原理就是通过拼接SQL语句绕过代码逻辑,达到攻击的目的
如何防止:不直接拼接SQL,适用预编译SQL,需要用户传入的字段进行类型判断然后再传入SQL模板
先通过setnx设置锁,拿到锁的进程执行,没有拿到的等待,执行完之后通过del 删除锁,然后其他进程继续获得锁,通过设置过期时间来保证出现进程意外crash不释放锁的情况