zoukankan      html  css  js  c++  java
  • mysql数据库优化

    一、索引概述

    索引是一种数据结构,

    1. 优势:相当于书籍目录,能提高查询速度,提升I/O效率,降低数据排序的时间
    2. 劣势:占用磁盘空间,很小可以忽略;影响数据更新操作,增删改等。
    • 索引结构

    默认b+tree(innodb引擎)

    • 索引类型
    1. 单值索引:一个索引只包含一个列,一个表可以有多个单值索引:
    2. 唯一索引:列值必须唯一
    3. 复合索引:一个索引包含多列
    • 索引语句
    1. 查看索引 
      show index from tablename;
    2. 创建索引
      create index indexname on tablename(column_name);
    3. 删除索引
      drop index indexname  on tablename;
    • 索引设计原则
    1. 查询操作,数据量大
    2. 使用where的字段,查询效率好
    3. 使用唯一索引,区分度越高,索引效率越高
    4. 索引不宜创建过多,一方面增加了某些字段的增删改,一方面增加了选择索引的时间
    5. 利用最左前缀N个列组合而成的组合索引,相当于创建了N个索引,如果查询时where子句中使用了组成该索引的前几个字段,那么这条sql使用了这个组合索引

    二、性能检测

    • 查看sql的执行频率

    检测哪个sql需要性能提升,查看数据库的各操作的执行频次

    show status like "Com_____";

    查看innodb的增删改查操作的记录数

    show status like 'Innodb_rows_%';
    • explain分析执行计划
    1. explain值id,tablename等没有作用
    2. 重点explain之type,不通知代表查询的效率,下表展示了查询sql的扫面效率。如果type为ALL就必须考虑优化了,range基本满足要求了。

    3.possible_key表示可能用到的key;key表示用到的key;key_length 表示kedy的长度;raws表示查询的行数,也可以大概反映查询的效率

    • show profile分析SQL
    1. have_profilling查看当前Mysql是否支持profile;
    2. set profilling =1;开启profile
    3. show profilling;可以直接查看前面的sql查询时间

    • 慢查询

     三、索引的使用

    • 最左前缀法则

    当建立复合索引时,只有当查询时包含复合索引中最左侧的字段,才会走索引查询,即只要包含最左边的字段,都可使用索引查询,否则不会使用索引查。

    如,创建复合索引:

    create index idx_seller_name_sta_addr on tb_seller(name,status,sddress);

    只有当查询时where中包含name字段,才会走索引,否则一律非索引查询。当复合最左前缀索引时,但出现条约某一列,只有最左索引生效,并且索引顺序不影响查询结果

    •  范围查询右边的列,不能使用索引

    •  不要在索引列上进行算术运算,否则索引失效
    •   字符串不加单引号,造成索引失效

    •   尽量使用覆盖索引,减少使用select *

    其实就是,尽量返回索引包含的字段,当需要返回索引不包含的字段时,需要回表查,会降低性能

     用or分割开的条件,如果or前的条件列有索引而后面列没有,那么索引失效,涉及到的索引不会被使用。

    • 以%开头的like模糊查询,索引会失效。而%在最后则索引会生效

    •  如果mysql评估使用索引比全表扫描慢,则不使用索引。

    下面的北京市的数据几乎占了全部数据,西安市就一条数据,所以不如查北京市时,直接全表扫描,不用索引。而西安市会用索引

    • is null 和is not null 有时索引会失效
    • 原因同上,根据查询数据量的情况,mysql会自动判断是否使用索引

    • in 走索引,not in 不走索引,同理

    • 尽量创建复合索引,少创建单列索引

    创建复合索引相当于创建了多个单列索引,这样使用查询的涵盖的情况更多一些

    四、常见性能优化

    • 优化insert语句

    • 优化order by,两种排序方式,filesort和index
      1.  第一种时通过队返回数据进行排序,也就是filesort排序,所有不是通过索引直接返回排序结果的排序都是filesort排序。

    这种查询结果中包含无索引的字段,就会出现索引失效情况,变成filesort排序。

    2.通过有序索引 排序,当需要排序时选择复合索引,并且排序字段和查询返回字段尽量使用有索引的字段。这样会使用索引提高效率。

    对于多字段排序,尽量同时使用升序或者降序,这样效率会高些。如果一个升序一个降序,可能只有一个排序字段索引有效,另外一个字段索引无效。

    •  优化分组group by
    1. 分组时不需要排序可以去掉排序过程,提高性能。在group by 后加 order by null

      2.嵌套查询优化 ,减少嵌套查询,可以使用一些连接查询

    • 优化分页查询

    下面的普通的分页查询是全表查,用不上索引;但是用优化方案,通过主键索引返回相关数据id,这里用上了索引,再连表查询相关信息。这样就提升了分页查询的速度。但是数据量大情况下,性能提升有限。

    •  数据量越大,查询的分页数据越多,越慢,针对这样的查询可以使用分页优化查询

     

    摘自:两小时拿下MySQL优化 记录一下,学习使用。

  • 相关阅读:
    解决Win8设置为快速启动后ubuntu不能访问win下磁盘的方法
    Why Not Specialize Function Templates?
    Build your first web service with PHP, JSON and MySql
    本地开发与linux服务器端的文件传输
    数据库设计中一对多的解决方法.
    C++ 模板练习摘要
    Understanding ASP.NET Validation Techniques
    我的sublime text 个人设置
    Eclipse 快捷键
    数字图像处理
  • 原文地址:https://www.cnblogs.com/zz22--/p/13629966.html
Copyright © 2011-2022 走看看