寻求优化方案

笑容为你 2012-08-21 08:26:49
加精
我要在数据库中存储对象,于是设计了以下表:

--
-- 表的结构 `tb_class`//存类名称
--

CREATE TABLE IF NOT EXISTS `tb_class` (
`class_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`class_name` varchar(200) CHARACTER SET utf8 NOT NULL DEFAULT '',
PRIMARY KEY (`class_id`)
);

--
-- 表的结构 `tb_property`//存类属性
--

CREATE TABLE IF NOT EXISTS `tb_property` (
`property_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`class_id` int(11) unsigned NOT NULL,
`property_name` varchar(200) CHARACTER SET utf8 NOT NULL,
PRIMARY KEY (`property_id`),
KEY `index1` (`class_id`)
) ;

--
-- 表的结构 `tb_object`//存对象名称
--

CREATE TABLE IF NOT EXISTS `tb_object` (
`object_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`class_id` int(11) unsigned NOT NULL,
`object_name` varchar(100) CHARACTER SET utf8 NOT NULL,
PRIMARY KEY (`object_id`),
KEY `index1` (`class_id`)
) ;

--
-- 表的结构 `tb_value`//存对象的值
--

CREATE TABLE IF NOT EXISTS `tb_value` (
`value_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`object_id` int(11) unsigned NOT NULL,
`property_id` int(11) unsigned NOT NULL,
`value` varchar(1000) CHARACTER SET utf8,
PRIMARY KEY (`value_id`),
KEY `index1` (`object_id`),
KEY `index2` (`property_id`)
) ;

-- --------------------------------------------------------

因为要存的对象有千万之多,按每个对象有20个属性算,tb_value得有1千万*20条记录,所以tb_value表大得惊人,查询效率低下!

我想不出更好的方法了,所以在这里向各位寻求好的方案

注:tb_class中的类有几千甚至上万,所以不能按类来做分表
...全文
2523 67 打赏 收藏 转发到动态 举报
写回复
用AI写文章
67 条回复
切换为时间正序
请发表友善的回复…
发表回复
探花 2014-07-05
  • 打赏
  • 举报
回复
select count(*)  from tb_value v where property_id=1001 and value = '男' 
AND exists (select object_id from tb_value where object_id=v.object_id And property_id=1003 and value ='1985-01-01')
and exists (select object_id from tb_object where object_id=v.object_id And class_id=1001) 
分析楼主的SQL,发现楼主的业务始终是围绕object_id进行关联, 可以考虑将 tb_value按照object_id 做分表(譬如简单的按照取模进行HASH分布) 上层对tb_value进行查询时,根据查询的object_id 到相应分表查询(不要出现跨表查询的情况) 看楼主的SQL应该是统计类的应用,统计类应用完全没必要做到实时,这种统计建议定时统计然后放入缓存, 用户访问直接读缓存即可
笑容为你 2012-09-02
  • 打赏
  • 举报
回复
[Quote=引用 61 楼 的回复:]

把对象保存到数据库,有点儿意思

敢问是为了处理什么业务呢?
[/Quote]

http://www.ibkda.com
小龙在线 2012-08-30
  • 打赏
  • 举报
回复
把对象保存到数据库,有点儿意思

敢问是为了处理什么业务呢?
小灰狼 2012-08-30
  • 打赏
  • 举报
回复
有上亿条记录的表,怎么都要考虑分区表了
笑容为你 2012-08-29
  • 打赏
  • 举报
回复
最后解决方案:按照属性id分表(Hash分区)

谢谢各位
a465677160 2012-08-24
  • 打赏
  • 举报
回复
过来学习学习 好像很多都不懂
avi9111 2012-08-24
  • 打赏
  • 举报
回复
100万就是瓶颈了,别说1000万了

20个字段算少了

最常碰到的问题就是

20个字段,但10个字段,多数都是空字串" "和null是不同的,占了很多位置,会对速度有点影响
resein 2012-08-24
  • 打赏
  • 举报
回复
这样有些困难呢
mynynyc 2012-08-24
  • 打赏
  • 举报
回复
来看高手解答
blackkettle 2012-08-24
  • 打赏
  • 举报
回复
看高手如何评论此帖
savageno1 2012-08-24
  • 打赏
  • 举报
回复
顺便可以再优化SQL语句试试,把范围小的条件放在后面。
select count(*)
from tb_value v
where
exists (select object_id from tb_value where object_id=v.object_id And property_id=1003 and value ='1985-01-01')
and exists (select object_id from tb_object where object_id=v.object_id And class_id=1001)
and value = '男' and property_id=1001
dfk728 2012-08-24
  • 打赏
  • 举报
回复
一看就头疼,还是慢慢学习吧
weishenmuijidan 2012-08-24
  • 打赏
  • 举报
回复
考虑下分表
bjyzyy1 2012-08-24
  • 打赏
  • 举报
回复
来学习一下,数据库的语言
zecool20 2012-08-23
  • 打赏
  • 举报
回复
我是来看ACMAIN_CHM的。。。。。
cdcjk 2012-08-23
  • 打赏
  • 举报
回复
好复杂好复杂
h2118023 2012-08-23
  • 打赏
  • 举报
回复
好复杂
wwwwb 2012-08-23
  • 打赏
  • 举报
回复
如果分表,将NAME单独存放1在1个表中,与工作表连接,有相同的KEY字段
ssd189 2012-08-23
  • 打赏
  • 举报
回复
我没有什么特别高尚的目的, 只是想把楼主的帖子顶起来.
mingfish2 2012-08-23
  • 打赏
  • 举报
回复
索引还没弄懂,得学习
加载更多回复(24)

56,679

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧