<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=409963&amp;view=findpost&amp;p=3694572</guid>
        <pubDate>Sun, 20 Nov 2016 21:11:29 +0000</pubDate>
        <title>UPDATE large table WHERE id in (1,2,3)</title>
        <link>https://forum.sources.ru/index.php?showtopic=409963&amp;view=findpost&amp;p=3694572</link>
        <description><![CDATA[Akina: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=409963&view=findpost&p=3694560'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Dart_Sitius &#064; <time class="tag-quote__quoted-time" datetime="2016-11-20T22:41:20+03:00">20.11.16, 19:41</time></span><div class='quote '>что-то такое?</div></div><br>
Близко не лежало. Я ж русским по белому отрисовал - сперва заливка, потом индексация.<br>
Более того - вот попробуй мне на основании только опубликованного тобой доказать, что временная таблица размещена в памяти...<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=409963&view=findpost&p=3694560'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Dart_Sitius &#064; <time class="tag-quote__quoted-time" datetime="2016-11-20T19:41:20+00:00">20.11.16, 19:41</time></span><div class='quote '>Версия MySQL 5.1.73-log.</div></div><br>
Можешь половину вышенаписанного смело забыть - на такой старой версии всё это неактуально.]]></description>
        <author>Akina</author>
        <category>Базы данных: SQL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=409963&amp;view=findpost&amp;p=3694570</guid>
        <pubDate>Sun, 20 Nov 2016 20:38:53 +0000</pubDate>
        <title>UPDATE large table WHERE id in (1,2,3)</title>
        <link>https://forum.sources.ru/index.php?showtopic=409963&amp;view=findpost&amp;p=3694570</link>
        <description><![CDATA[Dart_Sitius: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>&quot;Убивать&quot; SSD не особенно то и надо</div></div><br>
На хостинге не страшно ничего &quot;убивать&quot;, я ему плачу за это.<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Задери RAM по самое &quot;нехочу&quot;</div></div><br>
Даже 16Гб может не хватить <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2016-11-20T20:48:07+00:00">20.11.16, 20:48</time></span></span><br>
В том варианте, который я написал, к сожалению только дольше.<br>
show processlist; показывает, что на preparing тратится около 130 секунд, а суммарно вместе с closing tables около 160 секунд.<br>
без использования временной таблицы было 50 секунд на запрос и 30-40 на closing tables. Может я что-то сделал не так?<br>
<br>
Буду эксперементировать с InnoDB <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2016-11-20T21:00:00+00:00">20.11.16, 21:00</time></span></span><br>
хм, у меня оказывается оператива была забита (проверил в free -m). Почистил, теперь обычный запрос выполняется 25 вместо 56, а closing tables 10 вместо 30 секунд, т.е суммарно 35 секунд]]></description>
        <author>Dart_Sitius</author>
        <category>Базы данных: SQL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=409963&amp;view=findpost&amp;p=3694567</guid>
        <pubDate>Sun, 20 Nov 2016 20:29:44 +0000</pubDate>
        <title>UPDATE large table WHERE id in (1,2,3)</title>
        <link>https://forum.sources.ru/index.php?showtopic=409963&amp;view=findpost&amp;p=3694567</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=409963&view=findpost&p=3694550'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Akina &#064; <time class="tag-quote__quoted-time" datetime="2016-11-20T18:59:15+00:00">20.11.16, 18:59</time></span><div class='quote '>Начиная от SSD и заканчивая зеркалом таблицы в памяти</div></div><br>
Все абсолютно верно&#33; За исключением пару &quot;но&quot;:<br>
<ul class="tag-list"><li> &quot;Убивать&quot; SSD не особенно то и надо ... если вообще можно не убивать, мы же не киллеры :)</li><li> Задери RAM по самое &quot;нехочу&quot; - это будет а) Дешевле SSD б) Быстрее SSD в разы ... одна беда - сброс кэша, но это - пыль а не вопрос</li></ul>]]></description>
        <author>JoeUser</author>
        <category>Базы данных: SQL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=409963&amp;view=findpost&amp;p=3694560</guid>
        <pubDate>Sun, 20 Nov 2016 19:41:20 +0000</pubDate>
        <title>UPDATE large table WHERE id in (1,2,3)</title>
        <link>https://forum.sources.ru/index.php?showtopic=409963&amp;view=findpost&amp;p=3694560</link>
        <description><![CDATA[Dart_Sitius: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Каков объём одной записи? (строки - это в экселе)...</div></div><br>
Около 100 байт.<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Просто потому, что ни версии сервера, ни иных сведений нам не озвучено. Да и движок MyISAM - даже не распараллелить обработку.</div></div><br>
Хм, и действительно. InnoDB в данном случае похоже должен дать выигрыш. Версия MySQL 5.1.73-log.<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>и только потом UPDATE. И тогда при достаточно свежей версии сервера появляется надежда вместо fullscan получить index merge</div></div><br>
ок, спасибо, попробую <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2016-11-20T20:25:13+00:00">20.11.16, 20:25</time></span></span><br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mquery(&quot;CREATE TEMPORARY TABLE `tmp_update`(PRIMARY KEY (`id`), KEY (`storage_id`) USING BTREE) AS &quot;.</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&quot;(SELECT `id`, `storage_id` FROM `$sql_table` WHERE $where LIMIT $limit)&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mquery(&quot;UPDATE `$sql_storage` SET &quot;.$value[1].&quot; WHERE `id` IN (SELECT `storage_id` FROM `tmp_update`)&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mquery(&quot;DELETE FROM `$sql_table` WHERE `id` IN (SELECT `id` FROM `tmp_update`)&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mquery(&quot;DROP TABLE `tmp_update`&quot;); // потому что в цикле</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
что-то такое?]]></description>
        <author>Dart_Sitius</author>
        <category>Базы данных: SQL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=409963&amp;view=findpost&amp;p=3694555</guid>
        <pubDate>Sun, 20 Nov 2016 19:18:36 +0000</pubDate>
        <title>UPDATE large table WHERE id in (1,2,3)</title>
        <link>https://forum.sources.ru/index.php?showtopic=409963&amp;view=findpost&amp;p=3694555</link>
        <description><![CDATA[Akina: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=409963&view=findpost&p=3694552'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Dart_Sitius &#064; <time class="tag-quote__quoted-time" datetime="2016-11-20T19:06:05+00:00">20.11.16, 19:06</time></span><div class='quote '>Зеркало в памяти 40млн строк к сожалению невозможно.</div></div><br>
Каков объём одной записи? (строки - это в экселе)...<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=409963&view=findpost&p=3694552'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Dart_Sitius &#064; <time class="tag-quote__quoted-time" datetime="2016-11-20T19:06:05+00:00">20.11.16, 19:06</time></span><div class='quote '>Если в таблице есть индекс, то без разницы какого она размера? Имею ввиду, что если бы данная таблица была скажем не 40млн записей, а 5млн, но при этом в запросе мне все равно нужно было обновить 150к строк, то работало бы все те же 70 сек?</div></div><br>
Я даже сейчас не стал бы наверняка утверждать, что индекс используется. Просто потому, что ни версии сервера, ни иных сведений нам не озвучено. Да и движок MyISAM - даже не распараллелить обработку.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=409963&view=findpost&p=3694552'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Dart_Sitius &#064; <time class="tag-quote__quoted-time" datetime="2016-11-20T19:06:05+00:00">20.11.16, 19:06</time></span><div class='quote '>что даст то, что я размещу ID во временной таблице?</div></div><br>
Ты проглядел главное - ИНДЕКСИРОВАННАЯ таблица. То есть предполагается, что будет<br>
CREATE TEMPORARY TABLE (id)<br>
INSERT INTO TEMPORARY TABLE (id) VALUES (...)<br>
CREATE PRIMARY INDEX ON (id)<br>
и только потом UPDATE. И тогда при достаточно свежей версии сервера появляется надежда вместо fullscan получить index merge.]]></description>
        <author>Akina</author>
        <category>Базы данных: SQL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=409963&amp;view=findpost&amp;p=3694552</guid>
        <pubDate>Sun, 20 Nov 2016 19:06:05 +0000</pubDate>
        <title>UPDATE large table WHERE id in (1,2,3)</title>
        <link>https://forum.sources.ru/index.php?showtopic=409963&amp;view=findpost&amp;p=3694552</link>
        <description><![CDATA[Dart_Sitius: <strong class='tag-b'>Akina</strong>, спасибо за оперативный ответ.<br>
Заносить ID во временную таблицу - хорошая идея, так и сделаю.<br>
А вот таблица и так на SSD =( Зеркало в памяти 40млн строк к сожалению невозможно.<br>
<br>
Заодно задам вопрос, который меня давненько мучает. Если в таблице есть индекс, то без разницы какого она размера? Имею ввиду, что если бы данная таблица была скажем не 40млн записей, а 5млн, но при этом в запросе мне все равно нужно было обновить 150к строк, то работало бы все те же 70 сек? (хотя это легко сейчас проверить на практике, но в теории же так оно?) <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2016-11-20T19:09:15+00:00">20.11.16, 19:09</time></span></span><br>
Хотя стоп, а что даст то, что я размещу ID во временной таблице?<br>
Сейчас я делаю весь апдейт в одну строку UPDATE `table` SET `data`=`data`+1 WHERE `id` IN (1,2,3,...150000)<br>
Если я занесу в таблицу, то он превратится в <br>
CREATE TABLE`tmp`...<br>
INSERT INTO `tmp`(`id`) VALUES 1,2,3,...150000<br>
UPDATE `table` SET `data`=`data`+1 WHERE `id` IN (SELECT `id` FROM `tmp`)<br>
Разве это быстрее?]]></description>
        <author>Dart_Sitius</author>
        <category>Базы данных: SQL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=409963&amp;view=findpost&amp;p=3694550</guid>
        <pubDate>Sun, 20 Nov 2016 18:59:15 +0000</pubDate>
        <title>UPDATE large table WHERE id in (1,2,3)</title>
        <link>https://forum.sources.ru/index.php?showtopic=409963&amp;view=findpost&amp;p=3694550</link>
        <description><![CDATA[Akina: Они и выполняются быстро. 70 секунд / 150 тыс. записей = менее половины миллисекунды на запись. И это при том, что для КАЖДОЙ надо не только пересчитать значение, но и записать его, в т.ч. на жёсткий диск.<br><br>Куда копать? ускорять работу с таблицей, вероятно.<br><br>Первое - заносить весь этот набор ID во временную таблицу, размещённую в памяти. Индексированную, само собой. <br>Второе - переносить таблицу на более быстрый накопитель. Начиная от SSD и заканчивая зеркалом таблицы в памяти.]]></description>
        <author>Akina</author>
        <category>Базы данных: SQL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=409963&amp;view=findpost&amp;p=3694548</guid>
        <pubDate>Sun, 20 Nov 2016 18:49:07 +0000</pubDate>
        <title>UPDATE large table WHERE id in (1,2,3)</title>
        <link>https://forum.sources.ru/index.php?showtopic=409963&amp;view=findpost&amp;p=3694548</link>
        <description><![CDATA[Dart_Sitius: У меня есть большая MyIsam таблица на 40млн строк. id - это primary key. Мне нужно делать что-то вроде<br>UPDATE `table` SET `data`=`data`+1 WHERE `id` IN (1, 10, 100, 5, 3, 6...)<br><br>За раз в множество ID включается где-то 150к чисел. И на 1 такой запрос уходит примерно 70 секунд. Но мне нужно обновлять минимум миллион строк в минуту. Подскажите куда копать. Я думал операции по primary key должны выполняться быстро]]></description>
        <author>Dart_Sitius</author>
        <category>Базы данных: SQL</category>
      </item>
	
      </channel>
      </rss>
	