情境

时间:2016-12-07 07:19:13

标签: mysql performance

如果我有一个包含10k行的表TableA,我想搜索id > 8000

所有的行

当我使用SQL语句SELECT * FROM TableA WHERE id > 8000来搜索它们时,MySQL会做什么?它会搜索10k行并返回符合条件的2k行,或者只是忽略那些8k行并返回2k行数据吗?

我还要求每天在数据库中存储大量数据,并且需要快速搜索today条记录。一张大桌子还是最好的方法还是其他解决方案?

或者最好创建2个表。 all records为1,today's records为1,当新数据到来时,两个表都将插入,但第二天将删除第二个表的记录。

在比较选择速度或任何其他好的方法时,哪种方法更好?

  

实际上我现在没有真正的数据库,但我只是担心   在这种情况下哪种方式/方法可以更好

     

以下(8-12-2016 11:00)更新了以下信息

     

我正在使用InnoDB,但我会使用日期作为搜索键,而不是PK。

     

返回2k行只是研究的一个极端情况,但在实际情况下可能会返回(用户号码*该用户的每个记录),所以如果我有100个用户并且他们在那天制作了10个记录,我可能需要返回1k行记录。

     

我的真实情况是我需要每天存储所有用户记录(每个用户可能有10条记录),我需要生成最后一天记录和最近7天记录的排名,所以我只是担心我只是搜索最后一天记录在一个大表中,它会很慢还是创建另一个表只是为了保存最后一天的记录?

1 个答案:

答案 0 :(得分:1)

  • 你拿到超过20%的牌桌吗? (数字20%是不准确的。)
  • PRIMARY KEY上有id吗?或者它是次要钥匙?
  • 您使用的是ENGINE = InnoDB吗?

案例:InnoDB和PRIMARY KEY(id):执行将从8000开始直到完成。这是最佳的

案例:InnoDB,id是次要密钥,而且是“小型”密钥。正在获取的表的百分比:将使用索引;它是一个BTree,从8000扫描结束,跳转到数据(通过PK)找到行。

案例:InnoDB,id是次要的,大百分比:索引将被忽略,整个表格将被扫描("表格扫描"),忽略不行的行#39 ; t匹配WHERE子句。由于所有“跳转到数据”,表格扫描可能比前一种情况更快。

其他评论:

  • 10K行是"小"如桌子一样。
  • 返回2K行是"大"作为结果集去。你在做什么?
  • 是否有进一步的过滤,你可以转交给MySQL,这样你就不会得到所有的2K?使用COUNTSUM搜索索引等来考虑GROUP BYFULLTEXT
关于索引的

More tips