Hey there!
I’m really having a strange problem here.
I have the following 2 tables:
CREATE TABLE rainbowcrack_parts
(
partid
int(11) NOT NULL auto_increment,
tableid
int(11) NOT NULL,
userid
int(11) default NULL,
chainStart
bigint(22) unsigned NOT NULL,
chainCount
int(11) NOT NULL,
ip
varchar(255) default NULL,
status
int(11) default NULL,
starttime
datetime default ‘0000-00-00 00:00:00’,
finishedtime
datetime default ‘0000-00-00 00:00:00’,
clientid
int(10) unsigned NOT NULL default ‘0’,
creditvalue
float unsigned NOT NULL default ‘0’,
aggregated
tinyint(1) unsigned NOT NULL default ‘0’,
PRIMARY KEY (partid
),
KEY tableid
(tableid
),
KEY userid
(userid
),
KEY creditvalue
(creditvalue
),
KEY finishedtime
(finishedtime
),
KEY status
(status
),
KEY aggregated
(aggregated
),
KEY clientid
(clientid
)
) ENGINE=MyISAM AUTO_INCREMENT=1985956 DEFAULT CHARSET=latin1
CREATE TABLE rainbowcrack_clients
(
clientid
int(10) unsigned NOT NULL auto_increment,
lastseen
datetime NOT NULL,
userid
int(10) unsigned NOT NULL,
version
varchar(255) NOT NULL,
name
varchar(255) NOT NULL,
last7days
float NOT NULL,
PRIMARY KEY (clientid
),
KEY lastseen
(lastseen
),
KEY last7days
(last7days
)
) ENGINE=MyISAM AUTO_INCREMENT=16491 DEFAULT CHARSET=latin1
What i want is a list of how much each client has done, belonging to a specific user.
So i made the query
SELECT p.clientid, SUM(chainCount) AS numchains FROM rainbowcrack_parts p WHERE p.clientid IN (SELECT clientid
FROM rainbowcrack_clients c
WHERE userid = 2 AND DATE_SUB(NOW(), INTERVAL 14 DAY) < lastseen)
GROUP BY p.clientid
;
It takes almost 2 seconds to run. Using a EXPLAIN statement, i get
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY p ALL NULL NULL NULL NULL 497468 Using where; Using temporary; Using filesort
2 DEPENDENT SUBQUERY c unique_subquery PRIMARY,lastseen PRIMARY 4 func 1 Using where
The subquery returns 2 rows which is
clientid
14483
14644
If i try to run the query
SELECT p.clientid, SUM(chainCount) AS numchains FROM rainbowcrack_parts p WHERE p.clientid IN (14483, 14644)
GROUP BY p.clientid
it takes 15 ms. Using a EXPLAIN it returns
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE p range clientid clientid 4 NULL 1113 Using where
So its a much better query. But isn’t it the same query in the end?
Edit:
I also tried out
EXPLAIN SELECT p.clientid, SUM(chainCount) AS numchains FROM rainbowcrack_parts p
INNER JOIN rainbowcrack_clients c ON p.clientid = c.clientid
WHERE c.userid = 2
GROUP BY p.clientid
;
which returns (slow query)
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE p ALL clientid NULL NULL NULL 497468 Using temporary; Using filesort
1 SIMPLE c eq_ref PRIMARY PRIMARY 4 rainbowtables-distrrtgen.p.clientid 1 Using where