索引: 索引是帮助MySQL高效获取数据的数据结构。
索引数据结构:B+树索引、Hash索引、full-text全文索引、R-Tree索引
优势: ①提高数据检索效率,降低io成本。 ②通过索引对数据进行排序,降低数据的排序成本,降低cpu消耗。 劣势: ①索引也是一张表,保存了主键与索引的字段,会消耗磁盘。 ②提高了查询效率,但降低了更新表的速率,因为还要保存索引文件的索引列字段。
PRIMAR KEY:主键,唯一性,非空,最多一个。组合主键,多列相同就报错。 unique: 唯一键,用于保证该字段的唯一性,允许为空,可以有多个。(列级) foreign key :外键(表级),主表的关联列必须是一个key(一般是主键或唯一键) 索引:主键(唯一索引,且不能为null)、外键、唯一键(唯一索引,除了null)。
默认:多路搜索树(b+树),还有哈希索引 普通索引(index):一个索引只包含单个列,一个表可以有多个单列索引 唯一索引(unique index):索引列的值必须唯一,但允许空值 主键索引(primary key):创建主键,就为主键索引 组合索引:(index name (colum1,colum2)):多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用 全文索引(fulltext):主要用来查找文本中的关键字
B+树:
索引失效的情况: 1.查询条件包含or(只有当or左右查询字段均为索引时,才会生效) 2.组合索引,不是使用第一列索引,索引失效(key1,key2,只查询key2) 3.like 以%开头(like "%xxx" 而不是like "xx%") 4.如何列类型是字符串,where时一定用引号括起来,否则索引失效 5.当全表扫描速度比索引速度快时,mysql会使用全表扫描,此时索引失效
SQL慢的原因: ①查询语句写的烂 ②索引失效 ③关联查询太多join
SQL执行顺序: ①from(笛卡尔积) ③join ④group by ⑥select ⑧limit
②on (主表保留) ③where ⑤having ⑦order by
inner join 内连接(交集):select * from tableA A inner join tableB B on a.key = b.key; left join 左连接 (左边的全部) right join 右连接 (右边的全部) full outer join (全连接)
事务: 特性: ①原子性:要么都发生,要么都不发生。 ②一致性: 事务必须使数据库从一个一只状态,转换到令一个一致状态。 ③持久性: 事务一旦被提交,是永久性 ④隔离性:一个事务内部操作对并发的其他事务是隔离的。
事务的隔离级别:
mqsql,默认 REPEATABLE REAN(可重复读) 事务: delete 回滚成功,有数据 truncate 回滚成功,无数据
事务中加锁的方式: 快照读(snapshot read):快照读,读取的是记录的可见版本,可能是历史版本,不用加锁。 当前读(current read):读取读,读取的是最新版本,当前读返回的记录,都会加锁,保证其他事务不会并发地修改这条记录 记录锁、间隙锁都是排它锁 记录锁是 封锁记录,记录锁也叫行锁。 间隙锁:封锁索引记录中的间隔,或者第一条索引记录之前的范围,又或者最后一条索引记录之后的范围。会封锁该条记录相邻两个键之间的空白区域,防止其它事务在这个区域内插入、修改、删除数据,这是为了防止出现 幻读 现象。(但只解决了一条插入、一条读的情况;未解决一条插入,一条修改再读的情况)。 Serializable:不区别快照读与当前读,所有的读操作均为当前读(读加共享锁,写加排他锁) Repeated Read:针对快照读也加锁;针对当前读,保证对读取到的记录加锁 (记录锁),同时保证对读取的范围加锁(间隙锁),新的满足查询条件的记录不能够插入,为了解决幻读。 Read Commited:对快照读不加锁;针对当前读,RC隔离级别保证对读取到的记录加锁 (记录锁) Read uncommitted: 什么锁都不加
Mysql引擎: 功能 MylSAM MEMORY InnoDB Archive 存储限制 256TB RAM 64TB None 支持事务 No No Yes No 支持全文索引 Yes No No No 支持树索引 Yes Yes Yes No 支持哈希索引 No Yes No No 支持数据缓存 No N/A Yes No 支持外键 No No Yes No MySAM,表锁,操作一条记录,锁整个表。 InnoDB,行锁,操作时,只锁某一行。
delete和truncate在事务中使用时的区别 ①delete支持回滚 ②truncate不支持回滚
锁: 从对数据操作的类型: 读锁(共享锁):针对同一份数据,多个读操作可以同时进行不会互相影响。 写锁(排他锁):当前写操作没有完成前,阻断其他写锁和读锁。 从对数据操作的粒度: 表锁:偏读 行锁:偏写
视图:视图只保存了sql逻辑,不保存查询结果。 ①多个地方用到同样的查询结果 ②该查询结果使用的sql语句比较复杂。 create view xxx,创建 create or replace view xxx,创建或者修改 alter view xxx 修改 drop view xxx,xxx,... 删除
插入、修改、删除视图中的数据,源表也会被修改 为了安全起见,视图添加只读权限
包含以下类型的视图不能更新: ①分组函数、distinct、group by、having、union、union all。 ②常量视图: ③select 包含子查询 ④join ⑤from一个不能更新的实体 ⑥where子句的子查询引用了from子句中的表