Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2797387
  • 博文数量: 471
  • 博客积分: 7081
  • 博客等级: 少将
  • 技术积分: 5369
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-04 21:55
文章分类

全部博文(471)

文章存档

2014年(90)

2013年(69)

2012年(312)

分类: Mysql/postgreSQL

2012-07-04 14:12:12

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,以如下的查询: 

点击(此处)折叠或打开

  1. select *
  2. from topic
  3. where replyid in
  4.  (
  5.   select replyid from reply
  6.  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 























阅读(4551) | 评论(1) | 转发(0) |
0

上一篇:分析sql查询慢

下一篇:栈定义

给主人留下些什么吧!~~

nba76ers2012-07-05 09:17:51

围绕索引失效、表垂直 or 水平划分 子查询