I am launching an application that uses tables similar to the tables below. There is one table for articles, and another table for tags. I want to get the last 30 articles for a specific tag order by article id. for example, "acer", the query below will complete the task, but it will not be indexed correctly, because it will scan many lines if there are many articles related to a specific tag. How to run a query to get the same result without scanning a large number of rows?
EXPLAIN SELECT title FROM tag, article WHERE tag = 'acer' AND tag.article_id = article.id ORDER BY tag.article_id DESC LIMIT 0 , 30
Output
id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE tag ref tag tag 92 const 220439 Using where; Using index 1 SIMPLE article eq_ref PRIMARY PRIMARY 4 testdb.tag.article_id 1
Color tables and sample data:
CREATE TABLE `article` ( `id` int(11) NOT NULL auto_increment, `title` varchar(60) NOT NULL, `time_stamp` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1000001 ; -- -- Dumping data for table `article` -- INSERT INTO `article` VALUES (1, 'Saudi Apple type D', 1313390211); INSERT INTO `article` VALUES (2, 'Japan Apple type A', 1313420771); INSERT INTO `article` VALUES (3, 'UAE Samsung type B', 1313423082); INSERT INTO `article` VALUES (4, 'UAE Apple type H', 1313417337); INSERT INTO `article` VALUES (5, 'Japan Samsung type D', 1313398875); INSERT INTO `article` VALUES (6, 'UK Acer type B', 1313387888); INSERT INTO `article` VALUES (7, 'Saudi Sony type D', 1313429416); INSERT INTO `article` VALUES (8, 'UK Apple type B', 1313394549); INSERT INTO `article` VALUES (9, 'Japan HP type A', 1313427730); INSERT INTO `article` VALUES (10, 'Japan Acer type C', 1313400046); CREATE TABLE `tag` ( `tag` varchar(30) NOT NULL, `article_id` int(11) NOT NULL, UNIQUE KEY `tag` (`tag`,`article_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; -- -- Dumping data for table `tag` -- INSERT INTO `tag` VALUES ('Samsung', 1); INSERT INTO `tag` VALUES ('Acer', 2); INSERT INTO `tag` VALUES ('Sony', 3); INSERT INTO `tag` VALUES ('Apple', 4); INSERT INTO `tag` VALUES ('Acer', 5); INSERT INTO `tag` VALUES ('HP', 6); INSERT INTO `tag` VALUES ('Acer', 7); INSERT INTO `tag` VALUES ('Sony', 7); INSERT INTO `tag` VALUES ('Acer', 7); INSERT INTO `tag` VALUES ('Samsung', 9);