特定日期的简单mysql连接

时间:2014-05-02 07:21:37

标签: mysql sql

我有两个朋友和生日。

生日模式:userid和birthday_date

朋友架构:userid和userid2。

我怎样才能找到今天过生日的人的朋友? 我在想这样的事情:

SELECT *
FROM friends
WHERE userid2 IN
    (SELECT userid
     FROM birthdays
     WHERE birthday_date='05/02')

这是最好的方法吗?

以下是我获得的EXPLAIN响应:

+----+--------------------+-----------------------------+-----------------+-----------------------+---------+---------+------+-----------+--------------------------+
| id | select_type        | table                       | type            | possible_keys         | key     | key_len | ref  | rows      | Extra                    |
+----+--------------------+-----------------------------+-----------------+-----------------------+---------+---------+------+-----------+--------------------------+
| 1  | PRIMARY            | friends          | index           | NULL                  | userid2  | 8       | NULL | 4192662 | Using where; Using index |
| 2  | DEPENDENT SUBQUERY | birthdays | unique_subquery | PRIMARY,birthday_date | PRIMARY | 8       | func | 1         | Using where              |
+----+--------------------+-----------------------------+-----------------+-----------------------+---------+---------+------+-----------+--------------------------+

如果搜索400万行,它似乎没有优化。

此外,每列都有索引。

3 个答案:

答案 0 :(得分:1)

为了使查询更快,您需要在两个表上使用适当的索引以及JOIN。

这是一个例子

create table birthdays (userid int,birthday_date varchar(20));
insert into birthdays values (1,'1980-01-01');
insert into birthdays values(2,'1980-01-02');
insert into birthdays values(3,'1980-01-03');
insert into birthdays values(4,'1980-01-04');
insert into birthdays values(5,'1980-01-05');
insert into birthdays values(6,'1980-01-06');
insert into birthdays values(7,'1980-01-07');

create table friends(userid int, userid2 int);
insert into friends values(3,1);
insert into friends values(1,3);
insert into friends values(1,5);
insert into friends values(2,3);
insert into friends values (7,6);

alter table birthdays add index bday_idx (`birthday_date`);
alter table birthdays add index iduser_idx (`userid`);

alter table friends add index userid2_idx(userid2) 

现在如果我运行以下查询,肯定会更快

SELECT f.*
FROM friends f 
inner join birthdays b on b.userid = f.userid2 
WHERE b.birthday_date='1980-01-01'

ID  SELECT_TYPE     TABLE   TYPE    POSSIBLE_KEYS   KEY     KEY_LEN     REF     ROWS    EXTRA
1   SIMPLE  b   ref     bday_idx,iduser_idx     bday_idx    63  const   1   Using where
1   SIMPLE  f   ref     userid2_idx     userid2_idx     5   db_2_99839.b.userid     1   Using where

<强> DEMO

  

注意:当您使用公共密钥连接2个表时,请确保这两个表   具有相同的数据类型和长度,在上面的例子中它的连接   userid(birthday)和userid2(friends)因此它们具有相同的数据类型   和长度。其中条件列需要索引更快   fetch和优化器会考虑索引。

答案 1 :(得分:0)

尝试以下查询示例

SELECT friends.*
FROM friends inner join birthdays on friends.userid2 = birthdays.userid 
WHERE birthdays.birthday_date='05/02/2014'

始终使用datetime数据类型作为日期值。

答案 2 :(得分:0)

在MySQL上,JOINS的执行速度比嵌套的SELECT语句快得多。因此,首先,我会写一个这样的SQL语句:

SELECT friends.* FROM friends
INNER JOIN birthdays ON (friends.userid2 = birthdays.userid)
WHERE birthdays.birthday_date >= [start date] AND birthdays.birthday_date <= [end date]

然后,您可以使用今天的日期或一系列日期(如本周)替换[开始日期]和[结束日期],以返回相应的记录。