mysql两表组合查询的一种优化方法
表tab_product表为产品表
表tab_class为产品与分类对照表,一个产品可能属于多个分类
首页要确保 tab_class 表有 classid和productid 的复合索引
ALTER TABLE tab_class ADD INDEX idx_classid_productid (classid, productid);
JOIN 组合查询:
SELECT `tab_product`.* FROM `tab_product` JOIN `tab_class` ON `tab_product`.`id`=`tab_class`.`productid` WHERE `tab_class`.`classid` IN(3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606) GROUP BY `tab_product`.`id` ORDER BY `id` DESC LIMIT 10;
EXISTS 查询:
SELECT * FROM `tab_product` WHERE `id` IN( SELECT DISTINCT(productid) FROM tab_class WHERE classid IN(3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606) ) ORDER BY `id` DESC LIMIT 10;
在CodeIgniter中的写法:
$class_ids = [3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606]; $this->db->from('tab_product'); $this->db->where_in('id', " SELECT DISTINCT(productid) FROM tab_class WHERE classid IN (".implode(',', $class_ids).") "); $this->db->order_by('id', 'DESC'); $this->db->limit(10); $query = $this->db->get();
SELECT DISTINCT(productid) 中的 DISTINCT 可以省略,因为外层的 IN 会自动去重复。但如果结果集比较大还是建议加上。
也可以使用 EXPLAIN 查询两种方法的性能,择优使用