zoukankan      html  css  js  c++  java
  • MYSQL中IN,INSTR,FIND_IN_SET函数效率比较

    今天写代码时前台传过来类似‘1,2,3,4,5,6’的字符串,这种情况直接用IN是无效的,需要把字符串分割成数组或者组装成列表,然后再利用mabatis的foreach函数

    <select id = "queryXXX",resultType = "XXX", paramterType = "java.lang.HashMap">
    SELECT * FROM fast_input f where id in
    <foreach item="item" index="index" collection="list" open="("
                separator="," close=")">
                #{item}  
             </foreach>
    </select>

    或者可以用INSTR,FIND_IN_SET等函数,正好借此测试了下这个三个函数的效率。

    建表:

    CREATE TABLE `fast_input` (
      `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
      `content` varchar(100) DEFAULT NULL COMMENT '内容',
      PRIMARY KEY (`id`)

    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

    循环插入数据

    INSERT INTO fast_input(content) SELECT content FROM fast_input

    我用了65000条数据,分别执行以下语句

    SELECT * FROM fast_input f where FIND_IN_SET(id,'4,14,144');
    受影响的行: 0
    时间: 0.022s

    SELECT * FROM fast_input f where INSTR(CONCAT(',','4,14,144',','),CONCAT(',',id,','))>0;
    受影响的行: 0
    时间: 0.032s

    SELECT * FROM fast_input f where id in('4','14','144');
    受影响的行: 0

    时间: 0.001s

    可以看到,IN由于使用了主键的索引,效率最高,且甩另两个方法一个数量级,其次是FIND_IN_SET,最慢的是INSTR。但是有个问题大家注意下:

    SELECT * FROM fast_input f where FIND_IN_SET('4',id);
    受影响的行: 0
    时间: 0.021s

    SELECT * FROM fast_input f where FIND_IN_SET(id,'4');
    受影响的行: 0

    时间: 0.018s

    同为FIND_IN_SET,参数位置不同,效率也有影响,有兴趣的可以自己研究下为什么。

    PS:实际应用中,大家可以根据实际情况使用IN或者FIND_IN_SET函数,一个效率高,一个书写方便。

  • 相关阅读:
    Mysql -- SQL常用命令实例
    JavaWeb -- 文件上传下载示例
    Java -- 利用反射 操作任意数组,包括对象数组 和 基本数据类型的数组
    JavaWeb -- 自定义标签实例, 防盗链, JSTL 核心标签
    JavaWeb -- Jsp 自定义标签的使用
    JavaWeb -- http-equiv=refresh跳转的时候出现Session 丢失, 解决办法。。
    JavaScript -- 正则表达式 检验表单提交的内容
    FSG压缩壳和ImportREC的使用
    愉快的开始
    学习Python的捷径
  • 原文地址:https://www.cnblogs.com/cctvyuzhou/p/8985603.html
Copyright © 2011-2022 走看看