mysql的sql中若用IN查询时,若IN内的数据较大时,不走索引的解决办法

    有时候用IN查询时,可以很方便、直观的解决SQL的组装。但若IN中的数据较大时,基本就不走索引了。有几个解决方法:

    1、不用IN,这是废话,不在本篇文章中讨论;

    2、在SQL中指定走哪个索引;如果系统中用IN的地方比较多,维护起来也麻烦。

    3、修改MYSQL的eq_range_index_dive_limit参数,用来设置的阀值来按照不同算法预估影响行数,对于IN或OR条件中的每个范围段视为一个元组,对于元组数低于eq_range_index_dive_limit参数阀值时使用index dive,高于阀值时使用index dive:针对每个元组dive到index中使用索引完成元组数的估算,类似于使用索引进行实际查询得到影响行数index statistics:即根据索引的统计数值进行估算,例如索引统计信息计算出每个等值影响100条数据,那么IN条件中包含5个等值则影响5*100条记录。

    在MySQL 5.6版本中引入eq_range_index_dive_limit参数,默认值为10,通常业务在使用IN时会超过10个值,因此在MySQL 5.7版本中将默认阀值设为200。

    在使用IN或者OR等条件进行查询时,MySQL使用eq_range_index_dive_limit参数来判断使用index dive还是使用index statistics方式来进行预估:

    1、当低于eq_range_index_dive_limit参数阀值时,采用index dive方式预估影响行数,该方式优点是相对准确,但不适合对大量值进行快速预估。

    2、当大于或等于eq_range_index_dive_limit参数阀值时,采用index statistics方式预估影响行数,该方式优点是计算预估值的方式简单,可以快速获得预估数据,但相对偏差较大。

相关文章
Mysql性能之SQL语句性能优化WDCP升级5.2.17到5.3.17同时编译pdo_mysql如何测试MySQL的压力? mysql存储日期的方式基础篇:CentOS常用命令收藏利用mysql数据库中的TMD表修复“is marked as crashed and last (automatic?) repair failed”的错误使用批处理实现mysql数据库备份与上传MySQL实现表中取出随机数据MySQL优化全攻略-相关数据库命令distinct在mysql中查询多条不重复记录值的解决办法优化MySQL数据库性能的几个好方法在DOS命令行下发送邮件在MySQL里利用SQL语句批量替换页内字符mysql导入数据库文件最大限制更改解决方法通过MyODBC,用ASP操作MYSQL
    标签:MySQL 发布于:2021-01-09 22:18:13

当前共有0条评论,我也要发表:

    我的名字:

    我的邮箱: