龚哥哥 - 山里男儿 爱生活、做自己!
MySQL SELECT语句IN与OR的效率
发表于 2016-6-29 | 数据库

MySQL版本 5.7.13、SELECT语句IN与OR的效率比较,以下是数据查询量,表总数据量10万条。

100条数据
  字段为主键的情况
    in:0.04 sec
    or:0.06 sec

  添加索引的情况
    in:0.00 sec
    or:0.01 sec

  无索引的情况
    in:0.04 sec
    or:0.06 sec

1万条数据
  字段为主键的情况
    in:0.06 sec
    or:2 min 37.90 sec

  添加索引的情况
    in:0.08 sec
    or:2 min 39.22 sec

  无索引的情况
    in:0.07 sec
    or:2 min 39.73 sec

 10万条数据
  字段为主键的情况
    in:2.74 sec
    or:13 min 46.52 sec

  添加索引的情况
    in:2.94 sec
    or:14 min 13.72 sec

  无索引的情况
    in:4.35 sec
    or:15 min 19.39 sec

查询数据小的时候并无多大差异,随着查询数据量增大OR就显的越来越慢。

创建表

CREATE TABLE `test_in_or` (
    `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增id',
    `number` int(11) UNSIGNED NOT NULL DEFAULT '0' COMMENT '编号',
    `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
    PRIMARY KEY (`id`)
) ENGINE=`InnoDB` AUTO_INCREMENT=1 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ROW_FORMAT=DYNAMIC COMMENT='测试or和in的效率' CHECKSUM=0 DELAY_KEY_WRITE=0;

添加索引

添加普通索引
  ALTER TABLE `test_in_or` ADD INDEX number(`number`);

删除普通索引
  ALTER TABLE `test_in_or` DROP INDEX `number`;

添加主键索引
  添加(PS在这里不需要):ALTER TABLE `test_in_or` ADD PRIMARY KEY (`number`);

  更新主键:ALTER TABLE `test_in_or` DROP PRIMARY KEY, ADD PRIMARY KEY (`id`, `number`);

PHP生成代码(语句太长,贴出来不容易)

数据写入sql语句
  $sql = 'INSERT INTO test_in_or (`number`) VALUES';
  $number = 100000;
  for($i=1; $i<=$number; $i++)
  {
    $sql .= ' ('.$i.'),';
  }
  echo substr($sql, 0, -1).';';

SELECT IN语句
  $number = 100000;
  $sql = 'SELECT * FROM test_in_or WHERE `number` IN (';
  for($i=1; $i<=$number; $i++)
  {
    $sql .= $i.', ';
  }
  echo substr($sql, 0, -2).');';

SELECT OR语句
  $number = 100000;
  $sql = 'SELECT * FROM test_in_or WHERE';
  for($i=1; $i<=$number; $i++)
  {
    $sql .= ' `number`='.$i.' OR';
  }
  echo substr($sql, 0, -3).';';

发表评论:

TOP