MySQL锁定表有数百万行

时间:2016-04-02 10:22:24

标签: php mysql database

我一直在运营一个网站,其中包含大量数据。

用户将数据(如ip,id,date)保存到服务器,并将其存储在MySQL数据库中。每个条目都作为一行存储在表格中。

现在表格中有大约2400万行

问题1:

现在情况变得缓慢,因为全表扫描可能需要太多分钟,但我已将索引编入索引。

问题2:

如果用户从表中提取选择数据,则可能会阻止所有其他用户(因为表已被锁定)访问该网站,直到查询完成。

我们的服务器

  • 32 Gb Ram
  • 12核心,24线程cpu
  • 表使用MyISAM引擎

EXPLAIN SELECT SUM(impresn),SUM(rae),SUM(reve),date FROM publisher_ads_hits' 2015-05-01'之间的日期AND' 2016-04-02' AND userid =' 168' GROUP BY日期ORDER BY日期DESC

3 个答案:

答案 0 :(得分:2)

锁定来自@Max P的评论。如果您写入MyIsam表,则会阻止所有SELECT。只有一个表锁。如果您使用InnoDB,则只有一个ROW Lock锁定他们需要的ROW。 Aslo向我们展示了你的查询的EXPLAIN。所以你可能必须创建一个新的。 MySQL每个查询只能处理一个索引。因此,如果您在Where条件中使用更多字段,则在此字段上包含COMPOSITE INDEX非常有用

答案 1 :(得分:1)

根据解释,查询不使用索引。尝试添加复合索引(userid,date) 如果您有许多更新和删除操作,请尝试将引擎更改为INNODB。

答案 2 :(得分:0)

基本问题是全表扫描。一些建议是:

  • 根据日期对表格进行分区,并且在实时系统中保留6-12个月以上的数据
  • 在user_id上添加索引