发布网友 发布时间:2022-04-24 11:04
共2个回答
热心网友 时间:2022-04-10 09:04
你这个的前提是
水果个数基本固定
不超过10个,人的个数是不定的,无穷多个
1、不合理
效率很低,用了字符串匹配和全表扫描
都是耗时的操作
2、形成了两个百万级的大表,关联查询效率会很低
我建议三种方案,你自己试验一下哪种效率最高,因为设计和语句本身没有效率高低只说,和使用方式和数据量级别有很大的关系,几万和百万优化的策略是完全不同的
建议1:在你的第2种方案的基础上改进一下,建一个水果字典表C,给每个水果定义一个类似人员的ID号,然后表B存储变成存两个ID关联,并且这两个字段都是索引,表A的人员ID要是主键并且是唯一索引,然后语句如下:
select
*
from
表A
t
where
exists
(select
*
from
表B
where
水果ID
in
(1,3,4)
and
人员ID
=
t.人员ID)
建议2:用空间换效率,union在百万级的效率应该比or要高,所以作为第二种建议,类似于表A的表结构,每类水果都建一个表,然后喜欢这个水果的人就存入这个表,例如表-苹果,表-西瓜,里面存的是喜欢这类水果的人员ID和名称,这种方式是避免了查询,语句如下:
select
*
from
表-苹果
union
select
*
from
表-西瓜
union
select
*
from
表-香蕉
……
建议3:也是用空间换效率,不过用到了or,我估计在百万级效率会最低,在表A(不要存水果的字符串字段了)的基础上扩展10个字段,integer类型,分别对应10种水果,每个字段存0和1两个值,这10个字段都建上索引,语句如下:
select
*
from
表A
where
苹果=1
or
香蕉=1
or
……
热心网友 时间:2022-04-10 10:22
表A
id
name
1
张三
2
李四
3
赵武
4
刘七
表b
id
val
1 苹果
2
香蕉
3
石榴
4
山楂
表c
name_id
val_id
1
1
1
2
1
3
2
2
2
3
2
4
这样建表