mysql id in 效率,MySQL的“IN”操作符性能(数量很多)

我一直在做一些testing,正如大卫·费尔斯(David Fells)所说,这个testing已经非常好了。 作为一个参考,我创build了一个带有1000000个寄存器的InnoDB表,并使用500000个随机数的“IN”运算符进行select,在我的MAC中只需要2.5s。 (只select偶数寄存器需要0.5s)。

我唯一的问题是我不得不从my.cnf文件中增加max_allowed_pa​​cket参数。 如果没有,会产生一个神秘的“MYSQL已经消失”的错误。

这里是我用来做testing的PHP代码:

$NROWS =1000000; $SELECTED = 50; $NROWSINSERT =15000; $dsn="mysql:host=localhost;port=8889;dbname=testschema"; $pdo = new PDO($dsn, "root", "root"); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo->exec("drop table if exists `uniclau`.`testtable`"); $pdo->exec("CREATE TABLE `testtable` ( `id` INT NOT NULL , `text` VARCHAR(45) NULL , PRIMARY KEY (`id`) )"); $before = microtime(true); $Values=''; $SelValues='('; $c=0; for ($i=0; $i0) $Values .= ","; $Values .= "( $i , 'This is value $i and r= $r')"; if ($r0))) { $pdo->exec("INSERT INTO `testtable` VALUES $Values"); $Values = ""; $c=0; } } $SelValues .=')'; echo "
"; $after = microtime(true); echo "Insert execution time =" . ($after-$before) . "s
"; $before = microtime(true); $sql = "SELECT count(*) FROM `testtable` WHERE id IN $SelValues"; $result = $pdo->prepare($sql); $after = microtime(true); echo "Prepare execution time =" . ($after-$before) . "s
"; $before = microtime(true); $result->execute(); $c = $result->fetchColumn(); $after = microtime(true); echo "Random selection = $c Time execution time =" . ($after-$before) . "s
"; $before = microtime(true); $sql = "SELECT count(*) FROM `testtable` WHERE id %2 = 1"; $result = $pdo->prepare($sql); $result->execute(); $c = $result->fetchColumn(); $after = microtime(true); echo "Pairs = $c Exdcution time=" . ($after-$before) . "s
";

结果是:

Insert execution time =35.2927210331s Prepare execution time =0.0161771774292s Random selection = 499102 Time execution time =2.40285992622s Pairs = 500000 Exdcution time=0.465420007706s

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL中进行多表查询的方法有很多,其中最常用的方法是使用JOIN子句。JOIN子句用于将两个或多个表连接起来,使得可以从多个表中检索数据。以下是JOIN子句的一些常见用法: 1. INNER JOIN:返回两个表中匹配的行。例如,如果需要检索一个订单及其相关的客户信息,可以使用以下查询语句: ``` SELECT * FROM orders INNER JOIN customers ON orders.customer_id = customers.customer_id; ``` 2. LEFT JOIN:返回左表中的所有行,以及与右表中匹配的行。如果右表中没有匹配的行,则返回NULL值。例如,如果需要检索所有的客户及其相关的订单信息,可以使用以下查询语句: ``` SELECT * FROM customers LEFT JOIN orders ON customers.customer_id = orders.customer_id; ``` 3. RIGHT JOIN:返回右表中的所有行,以及与左表中匹配的行。如果左表中没有匹配的行,则返回NULL值。例如,如果需要检索所有的订单及其相关的客户信息,可以使用以下查询语句: ``` SELECT * FROM orders RIGHT JOIN customers ON orders.customer_id = customers.customer_id; ``` 4. FULL OUTER JOIN:返回左表和右表中的所有行,如果某个表中的行在另一个表中没有匹配,则返回NULL值。在MySQL中,没有内置的FULL OUTER JOIN语法,但可以使用UNION操作符来实现。例如,如果需要检索所有的客户及其相关的订单信息,可以使用以下查询语句: ``` SELECT * FROM customers LEFT JOIN orders ON customers.customer_id = orders.customer_id UNION SELECT * FROM customers RIGHT JOIN orders ON customers.customer_id = orders.customer_id WHERE customers.customer_id IS NULL; ``` 以上是一些常见的多表查询方法,根据实际情况选择合适的方法可以更高效地检索数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值