select - mysql两种查询的比较
高洛峰
高洛峰 2017-04-17 11:59:43
[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

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

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(2)
ringa_lee

方法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次,你的时间都消耗在连接上了

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号