php - 查询性能 SELECT FROM WHERE id 0 比 id 1 快
问题描述
我的服务器中有这个 php 代码
$social = array();
$id = $db->idFromUsername($username);
switch ($_POST['action']) {
case 'GET':
$query = 'SELECT user_one_id, user_two_id FROM social WHERE (user_one_id=? OR user_two_id=?) AND status=1';
foreach ($db->queryExecute($query, $id, $id) as $relationship) {
$friend = array();
$friend['username'] = $db->usernameFromId($relationship['user_one_id'] == $id ? $relationship['user_two_id'] : $relationship['user_one_id']);
$friend['userImage'] = getUserImage($friend['username']);
$social[] = $friend;
$status = 'true';
}
break;
case 'PENDING':
$query = 'SELECT user_one_id, user_two_id FROM social WHERE (user_one_id=? OR user_two_id=?) AND action_user_id!=? AND status=0';
foreach ($db->queryExecute($query, $id, $id, $id) as $pending) {
$person = array();
$person['username'] = $db->usernameFromId($pending['user_one_id'] == $id ? $pending['user_two_id'] : $pending['user_one_id']);
$person['userImage'] = getUserImage($person['username']);
$social[] = $person;
$status = 'true';
}
break;
.....
....
...
..
.
}
数据库表如下所示:
出于某种原因,如果有人能给我关于这种情况的见解,那么“get”的执行时间至少比“pending”长 4 倍,我将不胜感激。
谢谢你。
解决方案
虽然可以采取一些措施来缩小这种差距,例如添加适当的索引,但您真的不应该仅仅因为查询看起来相似就假设查询将具有相似的执行时间。仅基于用于参数的值,单个参数化查询可能具有非常不同的时间。
举个极端的例子,想象一下“WHERE id = 0”与“WHERE id = 1”在一个数百万行的表上,其中大多数行的 id=1,几乎没有行的 id=0。如果没有索引,两个查询的“查找”时间可能会相似,因为缺少索引需要进行全表扫描;但是其中一个收集和传输的数据量将比另一个多得多。使用索引,查找时间将大大减少,但即便如此,您仍然必须传输所有数据。
长话短说,从您显示的两个查询中,您的最佳索引可能是(status, action_user_id)
按该顺序排列的复合索引;该status
部分将(根据数据猜测)将检查的行缩小一半,并且该action_user_id
部分将进一步缩小(取决于正在搜索的值的唯一性)。颠倒顺序意味着第一个查询根本无法利用索引。
包含user_two_id
和/或user_two_id
可能不会对这些查询有帮助的索引,因为OR
条件几乎会丢弃任何潜在的索引用于被OR
一起编辑的条件。
推荐阅读
- javascript - 如何为这个 URL 创建正则表达式?
- html - 如何垂直对齐两行导航项?
- android-studio - 如何更改 NavigationView 菜单项的字体和大小?
- postgresql - do 运算符参数中的连接不起作用
- angular - ng generate module heros/heroes --module app --flat --routing 在这个 ng 命令中 --flat 是什么意思
- javafx - 线程“JavaFX 应用程序线程”中的异常 java.lang.ArrayIndexOutOfBoundsException
- eiffel - 埃菲尔:LINKED_LIST[STRING] 上的未知标识符“光标”
- blueprism - 阅读线程不再存在
- excel - 错误:“无单元格”。使用 if 退出 sub 如果为真,但错误不断弹出
- c# - 如何在 Razor 语法中组合嵌套模型 lambda