无痕
召唤看板娘

1,Mysql执行性能怎么调优优化?

这里可以提到使用explain命令查看SQL语句的执行情况,然后可以从编写SQL语句提升性能方面的细节,表结构涉及的细节来补充,最后可以再从建立以及优化索引的角度来说明补充提升mysql性能的方案:

答案: 一般使用explain命令对查询语句进行检查,可以检查其使用索引的情况以及返回扫描行数等等 explain 命令查看的语句能看到一些执行计划关键的列,比如

id:可以通过这个列查看sql哪些语句是先执行,哪些是后执行

主要看以下几个字段: type:判断sql性能和优化程度的重要指标 比如值为all的话表示是全表扫描,性能是很差的,需要优化; index表示只遍历了索引树; const表示通过索引一次命中,匹配一行数据 我们需要优化sql语句查询使用索引的情况,最好避免出现All和Index的情况

key:的值表示查询时真正使用到的索引

key_len:表示查询优化器使用了索引的字节数,可以评估组合索引是否被完全使用。

rows:表示sql扫描读取的行数,如果优化了索引之后,扫描的行越多,说明索引设置不对,或字段传入的类型有问题,优化空间很大。

extra:值using index,覆盖索引扫描,表示查询在索引树就可查找所需数据,性能不错 值using where,sql使用了where过滤,性能不错

2,Mysql性能优化有哪些?

使用覆盖索引,因为覆盖索引可以减少回表查询的次数,mysql5.6之后对覆盖索引做了进一步优化,支持索引下推的功能,把覆盖索引覆盖了的字段进一步筛选,尽量减少回表次数,可以在explain执行计划中的extra字段中using index看到这种情况;也可以利用最左原则和覆盖索引配合,减少一些索引的维护;

1)当只要1条数据的时候使用limit,否则mysql会一直查询全表符合条件的记录,浪费性能
2)选择正确的存储引擎

涉及MyISAM和InnoDB,myisam适合读,不适合写,因为写的话会加锁影响效率;Innodb则拥有复杂的存储特性,支持行锁,写操作比较多的用它, 并且支持很多高级应用,比如事务

3)使用not exists代替not in

not exists能够利用索引查询,而not in不会利用索引,是全表扫描,效率极其慢

4)对操作符优化,尽量不用不利于索引查询的

如:in , not in, is null, is not null, <>等等

5)某个字段总要拿来搜索的话,应为其建立索引
6)建立表注意事项:

给表创建主键,对于没有主键的表,在查询和索引定义上有一定的影响; 对于大数据字段,独立表进行存储; 避免表字段运行为null,建议设置默认值(例如:int类型设置默认值为0)在索引查询上,效率立显

补充:什么是最左匹配原则? 比如有个表建了a、b、c三个字段的联合索引,那么哪些情况下会触发索引呢? 只要查询条件中有a字段就会走索引,不管是bac、cba、ac、ca,都可以走索引,想不到吧,因为mysql有个sql优化器,会自己去优化顺序,但是如果你是bc或者b就不行

3,索引设计原则?

目的是查询更快,占用空间更小 适合建立索引 where子句后的列 或者 连接子句中指定的列 尽量使用短索引 不要过度索引,会适得其反 定义有外键的数据列 尽量扩展索引,如A索引基础上扩展为(A,B);不要新建索引

不适合建立索引 基数较小的表 更新频繁的字段 不能有效区分数据的列(如:性别 查询很少的列,重复值较多的列 text,image,bit数据类型

4,关心过业务系统里面的sql耗时吗?统计过慢查询吗?对慢查询都怎么优化过?

围绕3个点去思考? 是否load的不需要的列? 看看查询语句是否load的额外的列,然后又抛弃了没有用,这种情况就要分析重写sql语句,去除查询不要的列; 查询是否命中了索引? 分析语句的执行计划,获取索引的使用情况,之后修改语句或者索引,让查询语句尽可能多地命中索引; 慢的原因? 如果已经无法优化了,就要考虑表数据是否过多,可以横向或纵向分割表。

end
留言