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).';';