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位整数)
三、 多列索引 考虑类的查询速度,列的区分度,注意结合业务处理
例子:商城 goods表cat_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%” 展示是否使用数据库临时表
神回复
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。