mysql-性能优化

表的优化与列类型选择

空间换时间,时间换空间

表的优化

1.定长与变长分离
如id int占4个字节 char(4) 也占4个字节,这样在磁盘上好查找
核心且常用的字段 宜放在同一张表

varchar\text\blob变长字段适合单放一张表,用主键与核心表关联起来
2. 常用字段和不常用字段分离
3. 在一对多关系中,在一的一方增加冗余字段
例如:catelog下有多条topic,统计每个catelog下topic的数量

列的优化

  1. 字段类型优先级
    整型>date,time>enum,char>varchar>blob,text
    整型:没有国家地区的区分,没有字符集的差异

  2. 够用就行 不要慷慨
    人的年龄
    tinyint unsigned not null可以存255岁足够了 使用int会浪费3个字节

  3. 尽量避免使用null
    原因null不利于索引,要用特殊的字节标注
    在磁盘上占据的空间更大(mysql5.5已对null做改进,但查询仍不便)

可以建立两张相同的表,一个允许为null,一个不允许为null,各加入1万条数据,查看索引文件的大小,可以发现为null的索引要大一些。

另外null也不便于查询:
where 列名=null
where 列名!=null都查询不到值
where 列名 is null或is not null 才能查到值

索引优化策略

mysql中有两种索引类型,B-tree索引,hash索引,各有优势

B-tree索引

一般32层的b-tree树就能存42亿的数据

索引检索方式,先到树上找数据(使用索引较快),每个索引数据会保存该数据对应磁盘上的地址信息,那么就可以检索到对应记录

hash索引

这里写图片描述

建立索引常见误区

索引不仅能提升查询速度,也能提升排序速度(比如可以先遍历b-tree索引树,然后再对数据进行排序)和分组统计速度(一般分组之前都要排序)

在多个经常使用的列上都加索引是错误的,常用N列每列都加,变成了N个索引,最后只能用上一个

一般常用的情况是,经常使用的列联合起来定义一个索引,但想要索引生效,需要满足左前缀原则
这里写图片描述

索引实验(1)

这里写图片描述

创建表之后,在查询语句时使用,输出的key_len(指索引用在查询上,不包括排序和分组上):4,说明索引中的4个列都用上了(因为每个列长度1)
explain select …
这里写图片描述

A where c1=x and c2=x and c4>x and c3=x
key_len: 4,说明索引列c1,c2,c3,c4都用上了
B where c1=x and c2=x and c4=x order by c3
key_len: 2,说明c1,c2用上了,c3在查询中用不上,在排序中可以用上
D where c1=x and c5=x order by c2,c3
key_len: 1,只能用上c1
E where c1=x and c2=x and c5=x order byc2,c3
key_len: 2,只能用上c1,c2

联合索引面试题

这里写图片描述

聚簇索引与非聚簇索引

这两种分别对应Myisam引擎和innodb引擎,这两种引擎都使用的是B-tree索引,但具体略有不同

非聚簇索引

对Myisam来说,数据是一份单独的文件new.myd,索引是一份单独的文件new.myi,所以它使用的是非聚簇索引。索引指向行在磁盘上的位置(回行)
这里写图片描述

聚簇索引

这里写图片描述
重要不同:innodb直接在主键索引的树中,直接存储行的数据;非主键的索引树中,不存储数据,它的叶子节点指向主键索引树的叶子节点;
这里写图片描述
这里写图片描述

页分裂实验

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
非常有意思的现象是,聚簇索引中插入是乱序的,但是查询出来是有规律的,这就是因为聚簇索引把数据存在叶子节点上。

索引覆盖

针对Myisam引擎,如果发生回行,即在内存中找到索引树,然后去硬盘中找对应的数据文件,那么查询会比较慢;如果想要使查询不发生回行,那么就需要在内存中找到想要查询的数据,则需要建立联合索引,发生索引覆盖

下面的情况,不会产生回行,直接从索引树中取数据
这里写图片描述
这里写图片描述

比较一下发生索引覆盖和没有发生索引覆盖的差别:发生索引覆盖显示:Extra: Using index
这里写图片描述
这里写图片描述

索引覆盖实验

  1. 推断
  2. 创建3张表
  3. 向3张表中各插入10000条数据(t7,t8,t9:
    t7和t8可以用来比较Myasim和innodb引擎,t8和t9可以用来比较大字段列对查询的影响)
    这里写图片描述
    这里写图片描述
    这里写图片描述

实验过程: set profiling=1;
执行6条sql语句;
show profiles;
分析:通过 2和3的执行时间可以看出,对于Myisam引擎,两者比较相差不大。
通过4和5的执行时间可以看出,对于innodb引擎,表中包含大字段的情况,两者时间差距较大。因为大字段包含的数据存储在主键的B-tree树中。
通过6和7的执行时间可以看出,对于innodb引擎,如果表中不包含大字段,两者时间差距不大。

理想的索引

这里写图片描述
这里写图片描述

伪hash索引

这里写图片描述
这里写图片描述

在crc列上建索引

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值