2016-11-22 9 views
1

У меня очень странный вопрос, исходящий из замечаний, которые я только что сделал, которые могут помочь мне лучше понять поведение моей базы данных и создать ее лучше.Почему MySQL-запрос выполняется быстрее во второй раз?

Прежде всего, это база данных MySQL, о которой мы говорим. В поле User_ID есть индекс.

Вот код, я бегу:

query3 =("SELECT Content FROM Twit " 
      "WHERE User_ID = %s " 
      "limit 25 ") 

for userid, c_word in user22_list: 
    cursorSQL.execute(query3, (userid,)) 

По какой-то причине, что я не понимаю, когда я запускаю его для 200 Fisrt пользователей, например, то остановить его, он бы Arround за 1 сек 10 пользователей, довольно медленно.

Но Если через несколько минут я запустил его для первого пользователя 1000, он достигнет 200 менее чем за секунду, а затем замедлит скорость 10user/sec после этого и так далее, если я запустил его за 5000 после этого (очень быстро до 1000, медленный после этого).

Вопросы:

  • Может запрос будет временно храниться где-то (в памяти моего сервера?) Объяснить свою скорость?
  • Вы видите какие-либо способы ускорить процесс?

***** Edit1: В соответствии с просьбой:

ВыходSHOW CREATE TABLE Twit

Table Create Table  
    Twit CREATE TABLE `Twit` (
    `ID_num` bigint(45) NOT NULL, 
    `Content` varchar(250) COLLATE utf8mb4_unicode_ci DEFAULT NULL, 
    `User_ID` bigint(24) NOT NULL, 
    `Location` varchar(70) COLLATE utf8mb4_unicode_ci DEFAULT NULL, 
    `Date_create` datetime NOT NULL, 
    `Retweet_count` int(7) NOT NULL, 
    `isRetweet` tinyint(1) NOT NULL, 
    `hasReetweet` tinyint(1) NOT NULL, 
    `Original` bigint(45) DEFAULT NULL, 
    `Url` varchar(150) COLLATE utf8mb4_unicode_ci DEFAULT NULL, 
    `Favorite_count` int(7) NOT NULL, 
    PRIMARY KEY (`ID_num`), 
    KEY `User_ID` (`User_ID`), 
    KEY `Date_create` (`Date_create`), 
    KEY `User_ID_2` (`User_ID`) 
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci 

ВыходEXPLAIN SELECT Content From...

  • ID = 1
  • SELECT_TYPE = 'SIMPLE'
  • "таблица" = 'Упрек'
  • Перегородки = NULL
  • тип = 'ссылка'
  • possible_keys = 'User_ID, User_ID_2'
  • "ключ" = 'User_ID'
  • key_len = '8'
  • исх = 'Const'
  • "строки" = 298
  • filter = 100
  • Дополнительно = 'Использование условия индекса';

Переменные:

  • 'innodb_buffer_pool_size', Value = '4294967296';

Чтобы сделать его более четким, я звоню запрос SELECT, в цикле питона. Каждая итерация выполняется очень быстро, если я уже выполнил запрос SELECT для этого пользователя, но в то же время очень медленный.Не имеет значения, было ли пропущено ОЗУ (перезагрузка сервера) или нет.

Спасибо.

+5

[Должен ли я обвинять кеширование, да!] (Http://shouldiblamecaching.com/) ':)' –

+1

Черт, вот что я не хотел слышать !!! означает, что тогда невозможно оптимизировать? спасибо, хотя – ylnor

+0

На самом деле этот выглядит как встроенная функция оптимизации. Лол. –

ответ

3

Есть два «тайника», которые могут объяснить время «ускорения».

  • InnoDB использует свой «буферный пул», чтобы избежать перезагрузки материала с диска.
  • Если «Кэш запросов» включен, второй запуск может быть «мгновенно», поскольку QC кэширует результирующий набор.

«затем замедлить скорость 10user/sec после этого» - пахнет, поскольку данные еще не кэшированы.

Не используйте LIMIT без ORDER BY, если вам не все равно, какие строки вы вернетесь.

Что такое cursorSQL? Различные клиенты делают что-то по-другому; может быть важно понять, какой язык вы используете.

Просьба предоставить SHOW CREATE TABLE Twit и EXPLAIN SELECT ..., чтобы мы могли получить более подробную информацию.

Пожалуйста, объясните, что вы подразумеваете под «запустить его для первого пользователя 1000». Это 1000 выбирает? Один выбрать с LIMIT 1000? Что-то другое?

Сколько у вас RAM? Какова стоимость innodb_buffer_pool_size?

+0

Спасибо за ваш ответ. - Я не понимаю, что подразумевается под «кэшированием». Является ли это только кеш-память, или она может быть «жестко кэшированной». Поскольку предыдущее наблюдение применяется, я просто запускал запрос раньше или, если я только что перезагрузил сервер (и очистил ОЗУ ...). - cursorSQL поступает из используемого python-mysqlconnector.вызов SQL-запросов в python Я обновил сообщение, чтобы предоставить ответы на ваши вопросы. Еще раз спасибо! – ylnor

+0

Чтобы яснить, я вызываю запрос SELECT в цикле python. Каждая итерация выполняется очень быстро, если я уже выполнил запрос SELECT для этого пользователя, но в то же время очень медленный. Не имеет значения, было ли пропущено ОЗУ (перезагрузка сервера) или нет. Я также знаю, что это не оптимистично и что его можно вызывать в одном запросе вместо цикла. – ylnor

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