【问题标题】:Performance issue: Load data infile is making select query slow性能问题:加载数据文件使选择查询变慢
【发布时间】:2016-04-07 02:00:11
【问题描述】:

我有一个每天 24 小时扫描 twitter、facebook、google+ 的程序。每个用户正在运行并插入一个搜索列表(一次 100 个结果,函数循环运行,直到没有更多结果)

Yii::app()->db->createCommand(
     "LOAD DATA INFILE '/var/tmp/inboxli_user".$user.".txt'
      INTO TABLE inbox
      FIELDS TERMINATED BY ',$%'
      LINES STARTING BY 'thisisthebeginningxxx'
          (created_on, created_at, tweet, tweet_id, profile_image,
           twitter_user_id, screenname, followers, lang, tags, type,
           positive_score, readme, answered, deleted, searchlist_id,
           handled_by, used_as_newsitem,  user_id)
     "                       )->execute();

进入数据库以保持服务器上的负载尽可能小。但是,当我的函数进行批量插入时,我的选择函数运行速度非常慢。通常收件箱会在 1.5 秒内加载,但当插入运行时,有时需要 20 秒才能打开一个页面。

我的问题是如何优化这个?那么insert和select可以同时使用数据库而不会拖慢速度吗?

【问题讨论】:

  • 更新:我注意到如果我的 myisam 表第一次加载缓慢而第二次加载缓慢而只有 5 个新新闻项插入到数据库中。所以也许加载文件没有以正确的方式插入索引?
  • 请提供SHOW CREATE TABLE

标签: php mysql performance yii


【解决方案1】:
  • 离开 MyISAM!使用 InnoDB;它在不锁定其他操作方面做得更好。
  • 加载数据非常有效,将计数增加到 500 个。
  • 您有哪些索引?让我们看看SHOW CREATE TABLEDROP 任何不必要的索引;这将加快LOAD
  • 考虑关闭查询缓存。

【讨论】:

  • +1 for this comment 关闭查询缓存有很大帮助 dev.mysql.com/doc/refman/5.1/en/query-cache-in-select.html SQL_NO_CACHE 在 select 语句中添加这个,现在 select 不再减慢,我已经在使用 InnoDB / 索引设置好并且我对 my.cnf 做了一些小的修改以优化 innodb。
  • SELECT 确实放慢了速度,只是没那么快。此外,在具有大量“同时”连接的系统中,每个 选择都会在意识到它不会使用 QC 之前命中 QC Mutex。当 QC 被发明时,这不是单核机器的问题;但对于大量使用的 32 核机器来说,这是一个大问题。
  • 真正关闭它的方法是query_cache_type = OFF query_cache_size = 0
  • 感谢 Rick 的解释,对我很有帮助,我刚刚纠正了这个问题,现在一切正常。
【解决方案2】:

嗯,首先你应该确保你正确地索引了你的表。见How does database indexing work?

这将大大加快选择语句的速度。

其次,您可以将文件分成多个块。因此,数据库服务器会删除您加载的每个新文件的缓存和日志。

见:https://www.percona.com/blog/2008/07/03/how-to-load-large-files-safely-into-innodb-with-load-data-infile/

【讨论】:

  • 感谢您的回答,但是该表的索引很好,而且文本文件每次插入时仅包含 100 个结果。因此,情况似乎不太可能。
猜你喜欢
  • 2014-02-18
  • 2015-01-06
  • 1970-01-01
  • 1970-01-01
  • 2013-10-14
  • 2021-03-21
  • 1970-01-01
  • 2012-06-29
  • 1970-01-01
相关资源
最近更新 更多