mysql两种查询的比较

假如有一张分类表,结构:

CREATE TABLE `good_category` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `pid` int(11) NOT NULL DEFAULT '0' COMMENT '父类id',
  `cate_name` varchar(100) NOT NULL COMMENT '分类名称',
  `cate_order` varchar(100) NOT NULL COMMENT '同级分类下分类的显示顺序',
  `add_time` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;

有一张商品表,结构:

CREATE TABLE `good` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `cate_id` int(11) NOT NULL COMMENT '商品分类',
  `name` varchar(200) NOT NULL COMMENT '商品名称',
  `price` decimal(12,2) NOT NULL COMMENT '商品价格',
  `origin_price` decimal(12,2) NOT NULL COMMENT '商品原价',
  `image` varchar(200) NOT NULL COMMENT '商品图片',
  `detail` text NOT NULL COMMENT '商品详情',
  `sort` int(11) NOT NULL COMMENT '商品排序',
  `status` tinyint(1) NOT NULL COMMENT '是否下架 0表示下架,1表示上架',
  `add_time` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

再获取商品的同时获取商品的分类名称,有两种方式:
方法1:先获取所有得商品,然后获得商品对应的分类,下面是伪代码

 $goods = select * from goods
 foreach ($goods ad $good){
    $goods['cat_name'] = select * from good_category where id = $good[cat_id]
 }

方法2:直接连接查询获取商品的分类

 $goods = select * from good, good_category where good.cate_id = good_category.id

请问这两种查询方式,哪种查询方式比较好?

阅读 3.7k
2 个回答

方法2更好。
你可以在mysql 里面尝试一下explain。
以下是我的分析数据(数据是自己加上的)

    explain select * from good, good_category where good.cate_id = good_category.id;

+----+-------------+-------+--------+---------------+---------+---------+-------------+------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows |
+----+-------------+-------+--------+---------------+---------+---------+-------------+-----
| 1 | SIMPLE | e | ALL | NULL | NULL | NULL | NULL | 769 |
| 1 | SIMPLE | u | eq_ref | PRIMARY | PRIMARY | 4 | lvshi.e.uid | 1 |
+----+-------------+-------+--------+---------------+---------+---------+-------------+-----
一共要扫描769行

    explain select * from good;

+----+-------------+---------+------+---------------+------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+------+---------------+------+---------+------+------+-------+
| 1 | SIMPLE | ez_case | ALL | NULL | NULL | NULL | NULL | 769 | |
+----+-------------+---------+------+---------------+------+---------+------+------+-------+

也扫描769行

所以说 是否join,不会影响扫描的数量

如果你是用方法一的话,就有多了一步php操作没有必要。

第二种。

第一种的话……N个商品需要查询N+1次,你的时间都消耗在连接上了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题