2016-04-07 2 views
1

У меня есть программа, которая сканирует твиттер, facebook, google + 24 часа в сутки. За пользователь А спискупоиск работает и вставлен (100 результатов в одно времени, функция работает в цикле до тех пор пока не является futher результатов)Проблема с производительностью: загрузка данных infile делает запрос выбора медленным

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 секунд.

Мой вопрос, как я могу это оптимизировать? Таким образом, вставка и выбор могут использовать базу данных одновременно, не замедляя работу?

+0

ОБНОВЛЕНИЕ: Я замечаю, что только 5 новых новостей вставляются в базу данных в моей таблице myisam при первом запуске, а во втором - нет. Так что, может быть, загрузка в файле не вставляет индексы в правильном направлении? –

+0

Пожалуйста, предоставьте 'SHOW CREATE TABLE'. –

ответ

0

Ну, сначала убедитесь, что вы правильно указали таблицу. См. 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/

+0

Спасибо за ваш ответ, однако таблица хорошо проиндексирована, а также текстовый файл содержит только 100 результатов при каждом вставке. Поэтому кажется маловероятным, что это так. –

1
  • Сойти MyISAM! Использовать InnoDB; он делает гораздо лучшую работу, не блокируя другие действия.
  • Данные по нагрузке очень эффективны, увеличьте количество, скажем, 500.
  • Какие у вас индексы? Посмотрим SHOW CREATE TABLE. DROP любые ненужные индексы; это ускорит LOAD.
  • Рассмотрите возможность отключения кеша запросов.
+0

+1 для этого комментария отключение кэширования запросов помогло много http://dev.mysql.com/doc/refman/5.1/en/query-cache-in-select.html SQL_NO_CACHE, добавив это в оператор select, теперь select doesnot slow down больше, InnoDB, который я уже использовал/индексы, был настроен хорошо, и я сделал небольшую модификацию на my.cnf для оптимизации innodb. –

+0

'SELECT' _does_ замедляется, просто не так много. Кроме того, в системе с множеством «одновременных» соединений _every_ select будет попадать в Mutex QC, прежде чем он поймет, что он не будет использовать QC. Это не проблема, это одноядерные машины, когда КК был изобретен; но это большая проблема для сильно используемых 32-ядерных машин. –

+0

Путь к _really_ отключить это 'query_cache_type = OFF' _and_' query_cache_size = 0'. –

Смежные вопросы