V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yifeng
V2EX  ›  数据库

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

  •  
  •   yifeng · 2014-08-27 17:44:39 +08:00 · 837 次点击
    这是一个创建于 3530 天前的主题,其中的信息可能已经有所发展或是发生改变。
    表名: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,但是并没有达到要求,该怎么破,求前辈指点。
    8 条回复    2014-08-29 11:54:12 +08:00
    yifeng
        1
    yifeng  
    OP
       2014-08-27 18:02:49 +08:00
    一下就沉了,心里哇凉哇凉
    Livid
        2
    Livid  
    MOD
       2014-08-27 18:04:29 +08:00   ❤️ 1
    1. 试试用 int 来表示时间
    2. 试试给 sendtime 加 partition(如果是 MySQL 的话)
    dongyu
        3
    dongyu  
       2014-08-27 18:18:08 +08:00   ❤️ 1
    你查询的条件是用sendtime ,能否以某个时间间隔来分表呢,例如按天分表
    yifeng
        4
    yifeng  
    OP
       2014-08-28 09:17:53 +08:00
    @Livid 谢谢指导,我试一试。
    lenmore
        5
    lenmore  
       2014-08-28 11:07:27 +08:00   ❤️ 1
    1. select语句会输出多少条记录?一次输出记录太多的话,做个分页
    2. select真的有必要输出全部字段吗?
    3. 给数据库分配更多内存
    4. 如果有条件,上更好的硬盘。

    另外,100w真不算多大的数据量
    在一个150w的表上测了一下,也是datatime类型做范围查询,字段没有加索引,查询结果有7000条记录,耗时143ms
    yifeng
        6
    yifeng  
    OP
       2014-08-28 11:26:44 +08:00
    @lenmore select语句会输出100W条数据,是这一个月的记录,已经做了分页了,表中的字段都用到了,需要全部输出,我在自己的电脑上的测得,一次查询4s,服务器上不让跑,只能在自己电脑上捣鼓,你的耗时143ms,是如何做到的,麻烦指点一下,表中的字段长度和类型会不会影响查询速率,
    lenmore
        7
    lenmore  
       2014-08-28 15:52:42 +08:00
    @yifeng
    理解有点偏差,我以为表的总记录就100w哦,原来是一个月就有100w,那总记录数应该超千万了吧。
    如果这样,就像上面L大说的,分表或者分区吧。
    mengskysama
        8
    mengskysama  
       2014-08-29 11:54:12 +08:00
    @yifeng 你可以用mysql的explain看一下,我认为这个已经不是查询效率的问题了,主要时间都花在了数据传输上面最明显的就是磁盘IOPS和CPU性能。可能的话把这些都加载到到内存表里面,内存有限的话在撸个LRU什么的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1129 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 18:40 · PVG 02:40 · LAX 11:40 · JFK 14:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.