请教一个数据库优化的问题,主要是对表的查询操作,如何提高查询效率,降低查询所用的时间

2014-08-27 17:44:39 +08:00
 yifeng
表名:message
字段 类型 长度
id bigint 20 主键 自动增长
sendtime datetime
userrange varchar 50
content varchar 255
apptype varchar 25
title varchar 255
url varchar 255

-----------------------------------------------------------------------------------------
最频繁的操作就是根据sendtime字段进行查询
查询语句:select * from message where sendtime >"某个时间" and sendtime<"某个时间";
要求:数据小于100w条时页面响应时间应<0.5秒,大于100w条是页面响应时间应<1秒
------------------------------------------------------------------------------------------------------------------
从网上搜了好多资料,比如添加索引啊,改变查询条件啊,我给sendtime添加了索引,而且用到了between and,但是并没有达到要求,该怎么破,求前辈指点。
841 次点击
所在节点    数据库
8 条回复
yifeng
2014-08-27 18:02:49 +08:00
一下就沉了,心里哇凉哇凉
Livid
2014-08-27 18:04:29 +08:00
1. 试试用 int 来表示时间
2. 试试给 sendtime 加 partition(如果是 MySQL 的话)
dongyu
2014-08-27 18:18:08 +08:00
你查询的条件是用sendtime ,能否以某个时间间隔来分表呢,例如按天分表
yifeng
2014-08-28 09:17:53 +08:00
@Livid 谢谢指导,我试一试。
lenmore
2014-08-28 11:07:27 +08:00
1. select语句会输出多少条记录?一次输出记录太多的话,做个分页
2. select真的有必要输出全部字段吗?
3. 给数据库分配更多内存
4. 如果有条件,上更好的硬盘。

另外,100w真不算多大的数据量
在一个150w的表上测了一下,也是datatime类型做范围查询,字段没有加索引,查询结果有7000条记录,耗时143ms
yifeng
2014-08-28 11:26:44 +08:00
@lenmore select语句会输出100W条数据,是这一个月的记录,已经做了分页了,表中的字段都用到了,需要全部输出,我在自己的电脑上的测得,一次查询4s,服务器上不让跑,只能在自己电脑上捣鼓,你的耗时143ms,是如何做到的,麻烦指点一下,表中的字段长度和类型会不会影响查询速率,
lenmore
2014-08-28 15:52:42 +08:00
@yifeng
理解有点偏差,我以为表的总记录就100w哦,原来是一个月就有100w,那总记录数应该超千万了吧。
如果这样,就像上面L大说的,分表或者分区吧。
mengskysama
2014-08-29 11:54:12 +08:00
@yifeng 你可以用mysql的explain看一下,我认为这个已经不是查询效率的问题了,主要时间都花在了数据传输上面最明显的就是磁盘IOPS和CPU性能。可能的话把这些都加载到到内存表里面,内存有限的话在撸个LRU什么的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/130240

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX