索引

Innodb下有且只有一个聚簇索引,默认是主键,如果没有主键,则会选择一个唯一且非空的索引代替。如果还没有,则自动创建隐式的主键。如果不想让主键做聚簇索引,首先要删除主键,然后创建添加聚簇索引,最后再恢复主键才行。

聚簇索引:数据与索引放在一起,索引结构的叶子节点存放了行数据。 非聚簇索引:数据和索引分开存放,索引结构的叶子节点指向了存放数据的位置。

在聚簇索引的基础上建立的索引都是辅助索引,非聚簇索引都是辅助索引,比如:联合索引、前缀索引、唯一索引。比如如果按照名称搜索几条记录:首先会在辅助索引上找到记录的位置(聚簇索引),再根据聚簇索引找到数据记录。这个过程叫回表。

覆盖索引:索引值与要查的列一样,则不用会表。举例子,一个表abcdefg7个字段,在bc上建立联合索引。当执行如下sql时,不用回表(因为非聚簇索引中已经有了用户所要的数据,就不用回表了)

select b, c from table b = 1 and c = 2;

联合索引:注意最左匹配原则,遇到范围查询(> < between and),则停止匹配。比如一个表在a、b两个字段建立一个联合索引,当where条件是where a > 1 and b = 2 ,则b不会使用索引。当where条件是where a = 1 order by b desc ,则b不会使用索引,因为索引默认是升序。

前缀索引:一般在字符串上建立索引时,建议用前缀索引。尤其是当字符串的前面若干自己区分度比较大的时候。在整个字段上建立索引要消耗很多空间;而只在前几个字符上建立索引,则消耗空间较少。但是,比如所有中国人的地址,不要用前缀索引,13亿人,一共就34个省市区直辖市,区分度太小了。可以倒序存储地址字符串,以增大区分度。当然,13亿的数据,不能用mysql存储了。中国人的姓名也不要用前缀索引,因为太短了,没意义,重名也很多。

注:最左匹配原则,与where里字段出现顺序无关。
比如 abc三个字段上建立联合索引,"where a = 1 and b = 2 and c = 3"与"where c = 3 and b = 2 and a = 1"都是能用到索引的

mysql规范

单实例:qps(每秒处理请求)安全性是5000,tps(每秒处理事务)安全性是3000。

  1. 必须全部小写,windows不区分,linux默认区分。
  2. 引擎:InnoDB,字符集:utf8mb4
  3. 索引不超过5个
  4. 索引命名:唯一索引(uniq_字段名),普通索引用(idx_字段名),联合索引用(idx_字段1_字段2)

如何查看和设置mysql的隔离级别

其实最主要想记录一下myql查看事务隔离级别的操作,搜了一下,有相关文章,记录一下。

查看

查看当前会话的隔离级别:select @@tx_isolation;
查看全局的隔离级别:select @@global.tx_isolation;
mysql默认的隔离基本是可重复读 REPEATABLE-READ

设置

设置当前会话的隔离级别:

set session transacton isolation level read uncommitted;
set session transacton isolation level read committed;
set session transacton isolation level repeatable read;
set session transacton isolation level serializable;

设置当前会话的隔离级别:

set global transacton isolation level read uncommitted;
set global transacton isolation level read committed;
set global transacton isolation level repeatable read;
set global transacton isolation level serializable;