zoukankan      html  css  js  c++  java
  • mysql -- froce index 使用

    1.force index

    1.1 好用,但是项目中慎用

    最近解决mysql慢查询问题,先把sql大概说明下

    select pay_date from tableName  where add_time >'2019-05-14 23:59:59' and mark = 0 order by pay_date  limit 10;
    select pay_date from tableName  where add_time >'2019-05-17 23:59:59' and mark = 0 order by pay_date  limit 10;

    开发人员建了两个索引 idx_add_time 和 idx_pay_date, 结果mysql 一直是按照idx_pay_date 索引来查找的,查询比较慢,后来有人想到用force index(idx_add_time )解决,这样指定按照某个索引来查询,查询效率很高。但是指定索引就带来维护成本,比如哪天数据库改动需要删除索引index_type,如果忘记修改程序,程序必然会报错。

    1.2 详细说明

    #5000万+的数据
    #type=index说明整个索引树都被扫描了,效果显然不理想。 200S+ 都未查出
    explain select pay_date from pss_pay_order  where add_time >'2019-03-14 23:59:59' and mark = 0 order by pay_date  limit 10;
    ​ #type
    =range,说明索引树仅仅被部分扫描,要优于前面那个SQL. 不到5s即可查出 explain select pay_date from pss_pay_order force index(idx_add_time) where add_time >'2019-03-14 23:59:59' and mark = 0 order by pay_date limit 10;

    :explain type:index 与range 区别

    range 只检索给定范围的行,使用一个索引来选择行。key列显示使用了哪个索引一般就是在你的where语句中出现了between、<、>、in等的查询这种范围扫描索引扫描比全表扫描要好,因为他只需要开始索引的某一点,而结束语另一点,不用扫描全部索引

    index Full Index Scan,index与ALL区别为index类型只遍历索引树。这通常比ALL快,因为索引文件通常比数据文件小。(也就是说虽然all和index都是读全表,但index是从索引中读取的,而all是从硬盘中读的

    总结

    mysql可能并不总会选择合适且效率高的索引去查询,这时适当的force index(indexname) 强制告诉mysql使用什么索引尤为重要。

  • 相关阅读:
    【Tomcat】使用Eclipse发布项目时,项目启动路径错误。
    Unsupported major.minor version 52.0
    【转载】设置event.cancelBubble,使触发子元素的onclick不同时触发父元素的onclick
    【MG】测试
    【Tomcat】使用Eclipse运行Tomcat7源码
    【微信公众号】WeixinJSBridge.call('closeWindow')无效
    【微信公众号】使用a标签打开链接显示空白
    【JAVA】导出jar包时,Class files on classpath not found
    【JAVA】修改项目包名
    lesson3.1:java公平锁和非公平锁及读写锁
  • 原文地址:https://www.cnblogs.com/weixiaotao/p/10935151.html
Copyright © 2011-2022 走看看