CREATE TABLE topid{
topicId int not null primary key auto_increment, title text, author varchar(30), content blob, isDeleted int ...... //好像在author上定义了一个索引 } CREATE TABLE reply{ topicId int foreign key, replyId int primary key auto_increment, replyAuthor varchar(30), replyTime datetime, context blob ....... //定义了一个索引和key } 一个为主题表,一个为回复表。 1.问从性能上考虑,这样做有什么不足。 2.查询回复时间不超过一个特定的时间段,回复的作者名字以MIKE开头的主题 的title,以如下的查询: - select *
- from topic
- where replyid in
- (
- select replyid from reply
- where replyAuthor like 'mike%' and (currentTime()-replyTime))
从性能上考虑上述的查询语句有什么不足? 如何进行优化? 一、
1.问从性能上考虑,这样做有什么不足。 不足之处在于当主题数和回复数快速增长时..表的记录会无限增多最终导致查询会越来越慢。可扩展性很差.
2.查询回复时间不超过一个特定的时间段,回复的作者名字以MIKE开头的主题 的title,以如下的查询: select * from topic where replyid in (select replyid from reply where replyAuthor like 'mike%' and (currentTime()-replyTime 从性能上考虑上述的查询语句有什么不足? 如何进行优化?
性能上考虑,这条查询语句含有一个子查询.如果子查询查出的记录数比较多的话那么该语句效率会大大下降.而且取时间段的时候最好在程序中把时间段取好,不要在mysql中用函数和表达式,这会导致无法使用索引.
优化的话可以分成两条查询语句,先查出topicid,再查出主题的title另外题目中的sql语句本身就是错误的语句
应该是
select * from topic where topicId in (select topicId from reply where replyAuthor like 'mike%' and replyTime
currentTime()-time 表示特定时间段
二、
1.不能用(currentTime()-replyTime) > ? 的方式去比较时间,会造成计算字段无法使用索引的问题(任何关系数据库都是一样道理,包括最猛的oracle) 2、 In 这种写法, 性能更高. 因为它已经取得一个小的结果集再做join 操作,而不是left jion. 3. 只提供思路. 必须在一个小的结果集上做 like操作. 或者只在Author表当中做like操作,取得Author结果集,再做 IN操作. 我怀疑考官的目的是要 建立表,记录Author
阅读(4585) | 评论(1) | 转发(0) |