1. mysql索引类型
主键索引:primary key
设定为主键后,数据库自动建立索引,InnoDB为聚簇索引,主键索引列值不能为空(Null)。
唯一索引:
索引列的值必须唯一,但允许有空值(Null),但只允许有一个空值(Null)。
复合索引:
一个索引可以包含多个列,多个列共同构成一个复合索引。
全文索引:fulltext
Full Text(MySQL5.7之前,只有MYISAM存储引擎引擎支持全文索引)。
全文索引类型为FULLTEXT,在定义索引的列上支持值的全文查找允许在这些索引列中插入重复值和空值。全文索引可以在Char、VarChar 上创建。
空间索引:
Full Text(MySQL5.7之前,只有MYISAM存储引擎引擎支持全文索引)。
全文索引类型为FULLTEXT,在定义索引的列上支持值的全文查找允许在这些索引列中插入重复值和空值。全文索引可以在Char、VarChar 上创建。
索引设计的原则
1)适合索引的列是出现在where子句中的列,或者连接子句中指定的列;
2)基数较小的类,索引效果较差,没有必要在此列建立索引;
3)使用短索引,如果对长字符串列进行索引,应该指定一个前缀长度,这样能够节省大量索引空间;
4)不要过度索引。索引需要额外的磁盘空间,并降低写操作的性能。在修改表内容的时候,索引会进行更新甚至重构,索引列越多,这个时间就会越长。所以只保持需要的索引有利于查询即可。
索引的优化方案
虽然IS NULL可以命中索引,但是NULL本身就不是一种好的数据库设计,应该使用NOT NULL约束以及默认值。
- 更新十分频繁的字段上不宜建立索引:因为更新操作会变更B+树,重建索引。这个过程是十分消耗数据库性能的
- 区分度不大的字段上不宜建立索引:类似于性别这种区分度不大的字段,建立索引的意义不大。因为不能有效过滤数据,性能和全表扫描相当。另外返回数据的比例在30%以上的情况下,优化器不会选择使用索引,区分度可以使用 count(distinct(列名))/count(*) 来计算
- 业务上具有唯一特性的字段,即使是多个字段的组合,也必须建成唯一索引。虽然唯一索引会影响insert速度,但是对于查询的速度提升是非常明显的。另外,即使在应用层做了非常完善的校验控制,只要没有唯一索引,在并发的情况下,依然有脏数据产生。
- 多表关联时,要保证关联字段上一定有索引
- 创建索引时避免以下错误观念:索引越多越好,认为一个查询就需要建一个索引;宁缺勿滥,认为索引会消耗空间、严重拖慢更新和新增速度;抵制唯一索引,认为业务的唯一性一律需要在应用层通过“先查后插”方式解决;过早优化,在不了解系统的情况下就开始优化。
- 当使用索引列进行查询的时候尽量不要使用表达式,把计算放到业务层而不是数据库层
- 尽量使用主键查询,而不是其他索引,因此主键查询不会触发回表查询
- 使用前缀索引:注意:前缀索引是一种能使索引更小更快的有效方法,但是也包含缺点:mysql无法使用前缀索引做order by 和 group by。
事务的四个特性
原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。
一致性(Consistency):事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统运行中发生故障,有些事务尚未完成就被迫中断,这些未完成的事务对数据库所作的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是不一致的状态。比如A向B转账,不可能A扣了钱,B却没收到。(也可以理解为系统从一个正确的状态,迁移到另一个正确的状态)。
隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。
事务之间的隔离,是通过锁机制或者MVCC(多版本并发控制)实现的
在MySQL中,根据不同的划分标准,还可将锁分为不同的种类
按照粒度划分:行锁、表锁、页锁
按照使用方式划分:共享锁(读锁)、排他锁(写锁)
按照思想划分:悲观锁、乐观锁
持久性(Durability):指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其执行结果有任何影响。
数据库读写分离,主从同步实现方法
MySQL:常用分库分表方法
一条 SQL 语句是如何执行的
分库分表的分页查询的四种方案
MySQL 服务占用cpu 100%,如何排查问题?
MySQL实战:如何快速定位慢SQL