qiezijiajia

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

mysql的查询效率提升通常可以通过几个方面来回答:

数据库设计:

  建立索引:

    1.避免全表扫描,在设计where,order by的列上建立索引;

    2.索引对null值是不生效的,如果查询语句用到了null,则查询引擎会放弃使用索引,比如 select a from table where c is null; 所以建立索引字段的默认值最好不要为null;

    3.并不是所有索引都有效,sql会根据表中的数据进行查询优化的,当数据有大量重复时,查询可能不会去使用索引,比如sex一列中有男女,条数比例差不多,这样即使建了索引也没太大用处;

    4.索引不是越多越好,索引可以提高select的效率,但是对于insert或者update有可能会重建索引,所以需要视情况考虑。考虑一些索引是否有必要,一般一张表不建议超过6个,使用 show index in tablename查看。

    5.尽可能避免更新索引列,表变更会导致索引重新调整,耗费资源

  字段类型:

    1.尽量使用数字类型字段,若一个字段只包含数字类型不要设计为字符串类型,这会降低查询和连接的性能,且增加存储开销。这是因为引擎在处理查询和连接的时候会逐个比较字符串中的每个字符,而数字类型的只需要比较一次就可以了;

    2.尽可能的使用varchar/nvarchar代替char/nchar,因为变长存储空间小,可以节省空间;其实对于查询来说,在一个相对较小的字段内搜索效率肯定要高些;

  临时表:

    1.减少频繁的临时表创建和删除;

    2.如果使用到临时表,最后在存储过程中需要显示删除。避免系统表较长时间的锁定。

    3.在新建临时表时,如果一次性插入数据量很大,那么可以使用 select into 代替 create table

 

查询语句:

 避免全表扫描:

   1.尽量避免在where语句中使用!= 或<>,否则引擎将放弃索引而使用全表扫描;

   2.尽量避免在where语句中使用or条件,比如select a from table where b>10 or b<10;这样引擎也会使用全表扫描,可以使用union all来合并两个查询,如select a from table where b>10 union all select a from table where b>10;

   3.in或者not in 也要尽量避免,会导致全表扫描。如果是连续的数字,使用between代替;

   4.like语句得慎用,如果是全模糊匹配比如 like '%aaa%'这种是会全表扫描的,而使用like 'aaa%'这样还是使用到索引;

   5.尽量避免在where子句中使用表达式,否则引擎也会进行全表扫描,比如select a from table where b*2>10;

   6.尽量避免在where子句中使用函数,否则引擎也会进行全表扫描,比如select a from table where substring(c,0,10) like 'aaa%';

 其他避免:

   1.不要使用select * from ..,用具体字段代替*,不要返回一些不用的字段;

   2.避免使用游标;

   3.避免向客户端返回大量数据,可能考虑分页查询;

   4.避免大事务操作,提供并发;

   5.使用exist 代替in

代码方面:

  java方面:

    1.尽可能的少new对象;

    2.使用jdbc操作;

    3.合理利用内存,有的数据使用缓存;

    4.数据边读取边处理,不要一次性读到内存再处理;

    5.大量数据的操作和少量数据的操作要分开,这里涉及框架的选择;

    6.复杂sql使用执行计划查看,再具体优化;

 

posted on 2017-09-19 18:04  qiezijiajia  阅读(241)  评论(0编辑  收藏  举报