晓夏

北漂的女孩

Good Luck To You!

MYSQL数据库优化

浏览量:441

Mysql优化

表的优化:

1.定长与变长分离

2.常用不常用的分离

3.一对多,可以加冗余字段

列选择

1.整形>date time>enum,char>varchart>blob,text

2.够用就行,不要慷慨

3.尽量避免用null   mysql5.7以后优化了,查询不方便)

索引优化

Btree索引 myisam排好序的快速查找结构  索引数->  news.frm   news.myd   new.myi

Hash索引  查找速度快 拉链算法   范围没办法查询 没办法利用前缀查询

Btree常见的误区

where条件  常用的列都加索引 ,同时只能用1

多列索引  索引发挥,需要满足左前缀要求

Explain   语句

聚簇索引(innodb)  和 非聚簇索引(myisam

Innodb   在主索引文件上  直接存放该行数据,成为聚簇索引,次索引指向对主键的引用

Myisam中   主索引和次索引指向物理行

索引覆盖

尽量少使用磁盘查询,数据直接存在内存里面

Show  frofiles

理想的索引

1.查询频繁

2.区分高度

3.长度小

4.尽量能覆盖差用查询字段

一、针对列中的值,从左到有截取部分来建立索引

1.截取的越短,重复度越高,区分度越小,索引效果就底

2.姐却的越长,重复度越低,区分度数越高,索引效果越好,但带来的印象越大,增删改变慢影响查询效率。

惯用手法:截取不用的长度并做测试

Select count(distict left(world,1)) from dict limit 100;

Select((Select count(distict left(world,1)) from dict) / (Select count(*) from dict))

二、  对于左前缀不易区分的列 简历索引的技巧

倒叙存储

伪哈希技巧(crc32  是一种哈希算法    能把字符串转换成32位整数)

三、  多列索引  考虑类的查询速度,列的区分度,注意结合业务处理

例子:商城  goodscat_id ,brand_id做多列索引

业务场景:分类+小分类+品牌

索引建立:index(cat_id,brand_id)index(cat_id+shop_price)

还可以:index(cat_id,brand_id,shop_price)

最后确认:index(cat_id+shop_price)+index(cat_id,brand_id,shop_price)

 

索引和排序

1.对于覆盖索引的,直接在索引上查询就是有序的,using index

innodb中,隐者索引字段排序,也是自然有序的,对于myisam,如果按字段排序

如:id取出来字段,有末索引,如goods_name myisam的做法不是索引->回行而是现出来所有的行数,在进行排序

2.如果查询没有索引,建立临时表filesort文件进行排序,但文件可能在磁盘上或者内存

重复索引和冗余索引

索引碎片与维护

长期更改数据的过程中,索引文件和数据产生的空洞形成的碎片

Nop来修复表(不产生对数据实质的影响)表的索引innodb可以alter table ** engine innodb

Optimize table 表名字来修复

注意:修复表碎片,特别小号资源,不能频繁处理

Sql语句优化

1.sql花的时间在哪,等待查询

2.Sql查询的时间在哪  查找和取出来

如何查询的快?   联合索引的顺序区分度长度  

取出来的快?  索引覆盖

传输的少,更少的行和列

切分查询:按数据查分多次

SQL语句优化思路?不查->少查询->不查询

定量分析explain mysql语句

show static like %_table%  展示是否使用数据库临时表

神回复

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。