智力游戏:写sql 语句。。。要求执行效率高。。。可以给出时间复杂度说明。。。
问题1:查询出某一姓名的所有尼称,表如下(当然需要在数据级比较大的时候效率才明显,下表数据只是部份数据)
表名:dear
姓名编号名称...
你 1a
我3a
我3b
他6c
张7d
王10a
王10c
王10d
李13
赵18
.
.
.
问题2:查询出某一姓名的所有尼称,表如下(当然需要在数据级比较大的时候效率才明显,下表数据只是部份数据)
表1名:name
姓名编号...
你1
我3
他6
张7
王10
李13
赵18
.
.
.
表2名:dear
编号名称...
1a
3a
3b
6c
7d
10a
10c
10d
13
18
.
.
.
问题3:比较前2个问题的执行效率
[解决办法]
消灭0回复,,,
[解决办法]
问题1select * from dear where 姓名 = '你'问题2select name.* , dear.名称 from name,dear where name ='你' and name.编号 = dear.编号问题3:比较前2个问题的执行效率肯定是第一个效率高,因为第二个要联合两表查询.
[解决办法]
问题一会快,但是关系数据库就是靠关系来消除隆余的.问题2省空间,是一般的使用方法.
[解决办法]
海量数据的情况下,应该第一种的效率高。
单从效率考虑,将昵称串接放在一起,如:
王 10 a
王 10 c -〉王 10 a,c,d
王 10 d
虽然增加了昵称字段长度的开销,但减少记录数(相对增加长度的开销,可能还有赚),无疑检索更快。
[解决办法]
方法,最简单最有效就是直接select
问题1
在Name列建索引
create index 索引名 on 表(Name)
问题2:
建组合索引(Name,编号)
create index 索引名 on 表(Name,编号)
-----
[解决办法]
看你的表格之后发觉大家都被你的取名所误导了,
表中的编号仅仅是指姓的编号,所以编号和姓是一对一的。
表一表三中的名称就是指名,合起来就是一个姓下面有多少名,
所以表一和表三的复杂度一致,
都可以用编号+名字组成PK的。
建议直接丢弃编号栏位,
因为我觉得仅仅姓使用编号,名没有使用编号没有什么意义。
[解决办法]
我智商低了点,没看出来,接点分好了,hehe
[解决办法]
在只有一两个字段的情况下, 分表的好处根本就显现不出来的。
[解决办法]
个人更倾向于昨夜小楼的做法,
问题一:冗余度大。
二:查询效率问题。
三:不是很了解。
但是根据现在的情况来说,能从空间换取时间,从成本的角度考虑,冗余度不是大问题的。
当然表大到KG的情况,那我的说法就被推翻了。
[解决办法]
问是一只满足第二范式,问题二满足第三范式。数据量较大建议分表处理。