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

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐