RT:
大致场景是这样,我有一个app表
SQL code
CREATE TABLE IF NOT EXISTS `ch_app` (
`id` int(10) unsigned NOT NULL auto_increment,
`appname` varchar(100) NOT NULL COMMENT 'app名称',
`appenname` varchar(50) NOT NULL COMMENT 'APP名称英文首字母',
`tid` mediumint(5) NOT NULL COMMENT 'app分类',
`uid` int(11) NOT NULL COMMENT '商务经理',
`manager` int(11) NOT NULL COMMENT '渠道经理',
`channel_id` int(11) NOT NULL default '0' COMMENT '渠道商',
`reference` varchar(30) NOT NULL COMMENT 'app来源',
`package_name` varchar(255) NOT NULL COMMENT 'app包名',
`juwan_id` int(11) NOT NULL default '0' COMMENT '聚玩appid',
`downloadurl` varchar(255) NOT NULL COMMENT 'app下载路径',
`commission` enum('1','2') NOT NULL COMMENT '佣金类型:1,CPA;2:CPS',
`commissionval` decimal(8,2) unsigned NOT NULL default '0.00' COMMENT '佣金值',
`size` decimal(10,3) NOT NULL COMMENT '大小',
`system` enum('1','2') NOT NULL default '1' COMMENT '系统要求:1,android;2,ios',
`sort` int(11) NOT NULL default '0' COMMENT '排序',
`details` varchar(500) NOT NULL COMMENT '详细信息',
`edituptime` int(11) NOT NULL COMMENT '更新时间',
`appuptime` int(11) NOT NULL COMMENT 'app安装包更新时间',
`flag` tinyint(1) NOT NULL COMMENT 'app状态:0,未上架;1,上架;2,下架',
PRIMARY KEY (`id`),
KEY `app_enname` (`appenname`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='app管理表' AUTO_INCREMENT=13 ;
和用户表:
SQL code
CREATE TABLE IF NOT EXISTS `ch_user` (
`uid` int(11) NOT NULL auto_increment,
`username` varchar(50) default NULL,
`password` varchar(50) default NULL,
`group` tinyint(2) default NULL COMMENT '用户组',
`manager` int(11) default NULL COMMENT '渠道经理',
`accounttype` tinyint(2) default NULL COMMENT '账户属性',
`realname` varchar(50) default NULL COMMENT '真实姓名',
`telephone` bigint(12) default NULL COMMENT '固定电话',
`mobilephone` bigint(12) default NULL COMMENT '移动电话',
`qq` int(11) default NULL COMMENT 'QQ号码',
`company_name` varchar(100) default NULL COMMENT '公司名称',
`company_simple_name` varchar(20) default NULL COMMENT '公司简称',
`company_address` varchar(100) default NULL COMMENT '通信地址',
`company_zipcode` int(7) default NULL COMMENT '邮政编码',
`bank_name` varchar(100) default NULL COMMENT '开户银行',
`bank_address` varchar(100) default NULL COMMENT '开户银行地址',
`bank_account` varchar(50) default NULL COMMENT '银行账户',
`bank_username` varchar(50) default NULL COMMENT '开户名称',
PRIMARY KEY (`uid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=13 ;
我现在想通过联表方式 取出所有app表中数据及uid,manager,channel_id所对应的user表中的username或者realname
请问该怎么实现呢,或者说表设计要怎么改呢
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
首先,你目前的两个表设计是有优化的余地的
ch_app表里,诸如details这类字段,本身占用的磁盘空间很大,但是在查询中使用到的几率不高,你可以考虑把这些字段分表,减低磁盘io,对于提升查询效率帮助很大
ch_user表里,你也可以分拆成两个表,假设表里面有一部分字段是不会被经常使用的。
以上通过分表的方式,能明显提升sql查询效率,当然在业务上增加了复杂度。
其次,我个人习惯是,尽量避免使用关联查询,比如你题目中查出app表数据,通过uid查询用户信息
可以查出uid,在程序里单独去查询用户信息
这么做的好处就是,在你需要扩展的时候,比如使用redis memchaced等,不需要对现有代码做太大改变
缓存命中率也很高
总之,我个人推荐分开查询