【发布时间】:2013-01-29 13:14:29
【问题描述】:
我在一个数据库中有两个表。 Table1存储用户,Table2存储用户生成的数据。
由于表 1 中的一些用户出错,表 2 中没有任何数据。我想通知这些用户。
我正在使用 MySQL 以多种方式进行尝试。但没有任何效果,因为 PHPmyAdmin 冻结或 PHP 超时。这可能是因为第一个表包含 28.000 行,而第二个表包含 80.000 行。我只需要最后 5 天。
试用版 1
SELECT gebruikers.g_id
FROM gebruikers LEFT JOIN objecten ON objecten.o_g_id=gebruikers.g_id
WHERE objecten.o_g_id IS NULL
解释选择
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE gebruikers index NULL PRIMARY 4 NULL 25227 Using index
1 SIMPLE objecten ALL NULL NULL NULL NULL 81002 Using where; Not ex
试用版 2
SELECT g_id FROM gebruikers
WHERE g_id NOT IN(SELECT o_g_id FROM objecten WHERE o_startdatum <= NOW() AND o_startdatum >=NOW() - INTERVAL 5 DAY)
我做错了什么?
【问题讨论】:
-
80,000 行对于 MySQL 来说是非常少量的数据,它根本不应该挂在这上面,除非它运行在低端服务器上。 o_startdatum 是什么类型的字段?是日期还是日期时间?如果是日期,您是否在此字段上定义了索引?如果它是日期时间 - 最好创建一个 DATE 列(仅包含该字段的日期部分)并将其编入索引。另外,您希望这会返回多少结果?也许 phpMyAdmin 正在输出数据。
-
请包含解释查询的结果,
EXPLAIN SELECT gebruikers.g_id... -
@mat 是的,绝对让我们看看 Igor 提到的
EXPLAIN。并在两张表上发布DESCRIBE的输出。 -
试试:
SELECT gebruikers.g_id FROM gebruikers LEFT JOIN objecten ON objecten.o_g_id = gebruikers.g_id WHERE objecten.o_g_id IS NULL and o_startdatum <= NOW() AND o_startdatum >= (NOW() - INTERVAL 5 DAY); -
@mat in phpmyadmin 在表格的结构视图中,在提到的每个列上将鼠标悬停在“更多”上,然后选择“添加索引”。分别对每一列执行此操作。