我有两个朋友和生日。
生日模式: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万行,它似乎没有优化。
此外,每列都有索引。
答案 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]
然后,您可以使用今天的日期或一系列日期(如本周)替换[开始日期]和[结束日期],以返回相应的记录。