powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
85 сообщений из 85, показаны все 4 страниц
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38617686
useronforum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

Есть большая база данных MySQL
(записей до 10000, но есть большие BLOB-поля, которые нужно изменять,
поэтому база занимает на диске больше 3 Гб).

Нужно реализовать чтение всех записей таблицы
и БЫСТРОЕ изменение BLOB-поля многих записей.


ОБЯЗАТЕЛЬНОЕ ТРЕБОВАНИЕ:
Никакие компоненты для работы с БД, такие как DataSet не используются
(как здесь http://www.delphikingdom.com/asp/articles_forum.asp?ArticleID=1318 ),
поэтому метод Edit стандартных компонентов для редактирования
текущей записи использовать не получается,
то есть можно использовать MySQL.Query(...) и MySQL.ExecSQL(...).

===
Задачу я решил, но моё решение работает очень медленно:
за 12 часов обработалось примерно 10% базы данных.
И во время работы программы другие программы не могут нормально работать
с этой базой данной, так как всё тормозит
(систему нагружает MySQL - его процесс занимает почти всё процессорное время,
моя программа занимает до 5%).

Прошу предложить оптимизацию моего решения:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
  
offset1 := 0; // смещение в результатах поиска

// если использовать "SELECT *"  без "LIMIT 10", 
// то программе не хватает памяти и она завершается с ошибкой

repeat
  query_result := MySQL.Query('SELECT * FROM MyTable LIMIT 10 OFFSET ' + IntToStr(offset1));

  if (query_result = nil) or (query_result.RecordCount = 0) then Break;

  while query_result.FetchRow do // проходим по записям
  begin
    mypointer := query_result.ValueByName['IMAGE']; // получили ссылку на BLOB поле

    // далее загружаем BLOB-поле в MemoryStream, обрабатываем и
    // в новую переменную NewBLOB помещаем новое значение BLOB

    // теперь запишем новое значение BLOB в поле
    // (каждая запись уникальна по паре значений CODE и NUM)

    // СКОРЕЕ ВСЕГО ИМЕННО ЗДЕСЬ НУЖНА ОПТИМИЗАЦИЯ !!!

    // я не знаю как изменить текущую запись, поэтому изменение делаю так:
    MySQL.ExecSQL('UPDATE MyTable SET MyTable.IMAGE="' + NewBLOB +
                  '" WHERE CODE = ' + query_result.ValueByName['CODE'] +
                  ' and NUM = ' + query_result.ValueByName['NUM']);

    offset1 := offset1 + 10;

  until (query_result.RecordCount = 0);
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38617698
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это Delphi?
MySQL.Query - Это что такое?
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38617710
useronforum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторЭто Delphi?
Delphi, но вопрос по правильности SQL-запросов на изменение BLOB-поля текущей записи.

var MySQL: IMySQL;

Подключаемые файлы брал здесь:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1318

авторMySQL.Query - Это что такое?
SQL-запрос к базе данных
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38617723
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имхо, у вас большая часть времени бессмысленно теряется в OFFSET-ах.
И, кстати, LIMIT без ORDER BY - рулетка. Рискуете некоторые записи два раза обработать, а некоторые ни разу.

Я бы сделал так:

Цикл по запросу вида
Код: sql
1.
SELECT CODE, NUM FROM MyTable ORDER BY CODE, NUM

до Eof.

В цикле запросы:
Код: sql
1.
SELECT IMAGE FROM MyTable WHERE CODE=... AND NUM=...

Код: sql
1.
UPDATE MyTable SET MyTable.IMAGE=... WHERE CODE=... AND NUM=...



Обязательно должен быть индекс из полей CODE, NUM. В данном случае порядок полей в индексе не важен. Для других задач может быть важен.
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38617728
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
useronforumавторЭто Delphi?
Delphi, но вопрос по правильности SQL-запросов на изменение BLOB-поля текущей записи.

var MySQL: IMySQL;

Подключаемые файлы брал здесь:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1318

авторMySQL.Query - Это что такое?
SQL-запрос к базе данных

тогда я ваще не понимаю. если вопрос имено про склель строку, и метод апдейт назван нахудой конец (исхожу из слов, не знаю как обновить поэтому приходиться так)....

то похоже я тоже не умею в базе строчку обновить. :)
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38617748
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а вообще, здаёться мне лучше будет так

1)код который выгрузит нам нужные блоб поля в файлы на шдд
2)код на делфи обрабатывает эти файлы, и чтото там меняет сохраняя

3)потом идёт серия апдейтов указывая вкачестве значения поля LOAD FILE fname

если действительно хочеться оптимизировать... то надо избежать конвертаций бинарных данных в строку и обратно, как на стороне мускла так и на стороне клиента.

под словом файл, имееться ввиду любая ересь, с которой сможет работать мускл по типу
SELECT INTO FILE LOAD FROM FILE но скорей всего это будет действительно физический файл на шдд.

обход записей в базе для обработки, обычно делаеться либо курсором либо по типу описано выше.

ибо
не будете же вы
ни молиться чтоб никто в базу ничего не вставил /не удалил
ни блокировать всю базу на время этой обработки

любые селекты что вы изобретаете, не дадут ожидаемый результат если появяться новые записи, или удаляться старые. либо курсор, либо снимок базы но не надеяться на богов.
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38617754
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex5646574987654531)код который выгрузит нам нужные блоб поля в файлы на шдд
2)код на делфи обрабатывает эти файлы, и чтото там меняет сохраняяЗачем промежуточное сохранение в файл? это же утроение физического ввода-вывода.
Раз уж прочитали из MySQL BLOB в память, то в памяти его и обрабатывать.

alex564657498765453если действительно хочеться оптимизировать... то надо избежать конвертаций бинарных данных в строку и обратно, как на стороне мускла так и на стороне клиента.Вроде бы BLOB-ы такой конвертацией не страдают...
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38617774
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

серьёзно ??? а зачем мы при соединении указываем кодовую страницу??? не потому ли что общение исключительно текстом!

база из бинарника делает

100ef67a7c7b

мы врядли обрабатывая блоб, обрабатываем его имено в ввиде такой строки. идёт обратное преобразование в цепочку байт

цепочку байт обрабатываем, формируем ТЕКС СКЛ ! обратно конвертация, кидаем в базу, там обратная конвертация.


про файлы, я не говорю что файлы быстрее, я говорю что ему один чорт надо все сначало выгрузить, обрабатывать, потом загружать назад, а не надеяться на чесное пионерское, что за эти 10 часов никто не поменяет число записей в таблице(вставка, удаление)

и раз уж их все всторону смещать, я бы делал имено в файлы. хотя ... он сказал 10000 записей и 3гектара база, значит один блоб гдето 300кб... мдя...файлы плохая затея.

ЗЫ
а вообще меня смущает постановка вопроса... blob тип это как бы не для того чтоб брать и 10 байт в нём менять.
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38617778
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453а зачем мы при соединении указываем кодовую страницу???Для строковых полей.
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38617785
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

так же нужно отметить, что если мы его прочитали в память, и из памяти толкнули в мускл, далеко не тоже самое , что мы один раз прочитали с шдд цепочку байт, и один раз записали.

мы же про блоб говорим, тоесть я могу гиг в базу кидануть вкачестве блоба, врядли сеть быстро передаст гиг,и врядли оно будет лежать всё в оперативке, скорей всего в своп повалиться...

ЗЫ не зря же много когда используеться имено временный файл - это тогда, когда обьёмы не малые(не 2,4,8,16 байт) - когда есть шанс бросания в своп и обратно, а это куда медленее чем самому красивенько кидать в файл, потом считывать)
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38617794
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftalex564657498765453а зачем мы при соединении указываем кодовую страницу???Для строковых полей.

:) ней, для текста общения... просто латиница, на которой язык скл во всех кодовых страницах одинакова, и поэтому всегда читаеться, а не читаються только текстовые поля.

пойми мне правильно, сказать что мы указываем кодировку только для текстовых полей, тоже самое что мы указываем в штмл кодировку только для - содержания тегов, значений текстовых переменых. согласен фиг доколупаешься, ибо действительно только они будут не верно интерпретированы. но всётаки щитаю что кодировка указываеться для протокола, который основан на передаче текста!
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38617805
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453скорей всего в своп повалиться...откуда эти фантазии про своп, если там средний размер блоба 300Кбайт ?
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38617814
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
оптимизировать можно исключив limit
и выбирать по одной записи, лимит может вносить существенное торможение
даже при увеличении обращений к серверу это сэкономит время

чтои советует miksoft
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38617834
useronforum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторЯ бы сделал так:

Цикл по запросу вида
SELECT CODE, NUM FROM MyTable ORDER BY CODE, NUM
до Eof.
Действительно SELECT "CODE, NUM" выдаст записи без поля BLOB.
Возможно оперативной памяти хватит.
Надо попробовать.

Но если ключевые поля не эти, то сработает ли "ORDER BY CODE, NUM"?

авторВ цикле запросы:
SELECT IMAGE FROM MyTable WHERE CODE=... AND NUM=...
UPDATE MyTable SET MyTable.IMAGE=... WHERE CODE=... AND NUM=...
Не понимаю зачем первая строка,
ведь вторая строка не использует результат первой?
Или это один запрос?

авторОбязательно должен быть индекс из полей CODE, NUM. В данном случае порядок полей в индексе не важен. Для других задач может быть важен.
Базу данных не я проектировал.
Какие в ней ключи не знаю.
Структуру базы данных изменять нельзя.

авторИмхо, у вас большая часть времени бессмысленно теряется в OFFSET-ах.
Без них никак.
Если использовать "SELECT *" без "LIMIT 10",
то программе не хватает памяти и она завершается с ошибкой

авторИ, кстати, LIMIT без ORDER BY - рулетка.
Возможно важное замечание.
Но разве записи выдаются не в порядке добавления в таблицу?

авторРискуете некоторые записи два раза обработать, а некоторые ни разу.
Это не проблема. Я могу программу 10 раз запустить.

Тем более, что после изменения записи, записи повторно быстро обрабатываются.
(После обработке обычно их размер уменьшается в разы)

автора вообще, здаёться мне лучше будет так

1)код который выгрузит нам нужные блоб поля в файлы на шдд
2)код на делфи обрабатывает эти файлы, и чтото там меняет сохраняя
Через файлы ещё медленнее.

автор3)потом идёт серия апдейтов указывая вкачестве значения поля LOAD FILE fname
Приведите пример SQL запроса с загрузкой файла в BLOB-поле.

Подозреваю, что возможны ошибки SQL или зависания,
так как моя программа отправит 1000 запросов
на изменение BLOB-полей из 1000 файлов по 1 Мб,
и что в каком порядке и когда изменится не известно.

авторесли действительно хочеться оптимизировать... то надо избежать конвертаций бинарных данных в строку и обратно, как на стороне мускла так и на стороне клиента.
Это работает быстро.
Систему нагружает MySQL - его процесс занимает почти всё процессорное время,
моя программа занимает до 5%

авторобход записей в базе для обработки, обычно делаеться либо курсором либо по типу описано выше.
Как это?

авторибо
не будете же вы
ни молиться чтоб никто в базу ничего не вставил /не удалил
ни блокировать всю базу на время этой обработки
Я программу на ночь запустить могу, когда никто с базой данных не работает.

Проблема в том, что сейчас программа не может успеть за ночь.

авторлюбые селекты что вы изобретаете, не дадут ожидаемый результат если появяться новые записи, или удаляться старые. либо курсор, либо снимок базы
В моём случае этого можно избежать.

авторпро файлы, я не говорю что файлы быстрее, я говорю что ему один чорт надо все сначало выгрузить, обрабатывать, потом загружать назад, а не надеяться на чесное пионерское, что за эти 10 часов никто не поменяет число записей в таблице(вставка, удаление)
Мне надо быстрее.
Можно организовать, что за эти 10 часов никто не поменяет число записей.

автора вообще меня смущает постановка вопроса... blob тип это как бы не для того чтоб брать и 10 байт в нём менять.
Меняется не 10 байт, а абсолютно все байты и длина всего BLOB.
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38617855
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВ цикле запросы:
SELECT IMAGE FROM MyTable WHERE CODE=... AND NUM=...
UPDATE MyTable SET MyTable.IMAGE=... WHERE CODE=... AND NUM=...

Не понимаю зачем первая строка,
ведь вторая строка не использует результат первой?
Или это один запрос?



гыыыы
первая выбирает данное
второе записывает изменённое данное

CODE=... AND NUM=... - фильтрация данных для выбора и для записи

limit забирает всё время
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38617868
useronforum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторавтор
Я бы сделал так:

Цикл по запросу вида
SELECT CODE, NUM FROM MyTable ORDER BY CODE, NUM
до Eof.

Действительно SELECT "CODE, NUM" выдаст записи без поля BLOB.
Но мне нужно поле BLOB , чтобы на основании его рассчитать новое значение.

А если одним SELECT получить CODE и NUM,
а вторым получать по ним IMAGE,
то не потеряется ли результат первого SELECT (если всё-таки использовать OFFSET),
даже если я для результатов первого и второго SELECT заведу разные переменные?

автороптимизировать можно исключив limit
и выбирать по одной записи, лимит может вносить существенное торможение
даже при увеличении обращений к серверу это сэкономит время
Как без "LIMIT 1" с помощью "SELECT" получить 1 запись?
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38617873
useronforum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И есть ли в SQL команда на изменение i-ой записи в таблице без "WHERE"?
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38617882
useronforum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И в какой момент данные передаются в программу:
автор
query_result := MySQL.Query('SELECT * FROM MyTable LIMIT 10 OFFSET ' + IntToStr(offset1));
или
авторquery_result.FetchRow
?
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38617888
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
useronforum,

хм...если тебя устроит перенести логику на мускл, так напиши хранимку которая сделает нужные замены с блобами...

всётаки раскажи, что за замены ты с блобом делаешь, что надо их хранить в базе а не в файлах на шдд, и что нужны такие замены....
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38617896
useronforum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Базу данных не я проектировал.
Структуру базы данных изменять нельзя и другие изменения мне вносить нельзя.
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38617903
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
useronforumНо если ключевые поля не эти, то сработает ли "ORDER BY CODE, NUM"?Сработает, почему нет?
Хотя если индекс есть, то сработает значительно быстрее.
useronforumСтруктуру базы данных изменять нельзя.Индекс - это не структура.
Проверьте, возможно, индекс уже есть.
Без него даже ваш изначальный апдейт будет работать неразумно долго.
useronforumавторИмхо, у вас большая часть времени бессмысленно теряется в OFFSET-ах.
Без них никак.
Если использовать "SELECT *" без "LIMIT 10",
то программе не хватает памяти и она завершается с ошибкойНе знаю как у используемого компонента, а у нормальных Query можно ограничить размер потребляемой памяти буфером хоть на одну запись. Так что лимит сам по себе не нужен.
И, кстати, не пользуйтесь звездочкой в боевых запросах. Лишние поля таскать ни чему.
useronforumавторВ цикле запросы:
SELECT IMAGE FROM MyTable WHERE CODE=... AND NUM=...
UPDATE MyTable SET MyTable.IMAGE=... WHERE CODE=... AND NUM=...
Не понимаю зачем первая строка,
ведь вторая строка не использует результат первой?
Или это один запрос?Нет, это два запроса. Первый читает блоб, потом ваша обработка, второй сохраняет блоб.
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38617905
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторДействительно SELECT "CODE, NUM" выдаст записи без поля BLOB.

расшифруй
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38617920
useronforum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Про ключи узнал:
PRIMARY KEY (`CODE`,`NUM`,`DATE1`).


авторНе знаю как у используемого компонента, а у нормальных Query можно ограничить размер потребляемой памяти буфером хоть на одну запись. Так что лимит сам по себе не нужен.
Программа начинала занимать 900Мб и т.д. пока "Out of memory" не появилось.

авторавторавтор
Действительно SELECT "CODE, NUM" выдаст записи без поля BLOB.
расшифруй
IMAGE - BLOB-поле, которое занимает много байт.
Если его в SELECT не ставить, то меньше информации передаётся SELECT.
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38617924
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
useronforumПро ключи узнал:
PRIMARY KEY (`CODE`,`NUM`,`DATE1`).О, это хорошо. Отдельный индекс создавать не надо.
useronforumавторНе знаю как у используемого компонента, а у нормальных Query можно ограничить размер потребляемой памяти буфером хоть на одну запись. Так что лимит сам по себе не нужен.
Программа начинала занимать 900Мб и т.д. пока "Out of memory" не появилось.Смотрите свойства компонента. Например, Unidirectional.
Да и без этого, 10000 полей `CODE` и `NUM` займут копейки по сравнению с 900Мб.
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38617952
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторIMAGE - BLOB-поле, которое занимает много байт.
Если его в SELECT не ставить, то меньше информации передаётся SELECT.

а если ничего не ставить - ваще места буде дофига

тебе ж разжевали

Нет, это два запроса. Первый читает блоб, потом ваша обработка, второй сохраняет блоб.

а если и при этом у тебя будет переполнение памяти - зачит при обработке блоба ты не правильно работаешь с памятью
видимо в цикле создаются новые переменные, а не используются прежние
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38617960
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так сделал 15897029 ?
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38617962
useronforum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ошибки при работе появились.

Возможно нужно разные объекты MySQL для MySQL.Query
создавать для запроса
авторЦикл по запросу вида
SELECT CODE, NUM FROM MyTable ORDER BY CODE, NUM
до Eof.
и
авторВ цикле запросы:
SELECT IMAGE FROM MyTable WHERE CODE=... AND NUM=...
UPDATE MyTable SET MyTable.IMAGE=... WHERE CODE=... AND NUM=...
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38617966
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
useronforumВозможно нужно разные объекты MySQL для MySQL.Query
создавать для запросаДа, конечно, это два разных Query,
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38617982
useronforum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,
Только результаты Query разные переменные,
или и объекты для подключения к БД разные
и для каждого нужно отдельно указывать IP, Port, User, Password и делать Connect?
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38617988
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
useronforummiksoft,
Только результаты Query разные переменные,
или и объекты для подключения к БД разные
и для каждого нужно отдельно указывать IP, Port, User, Password и делать Connect?Сессия одна, Query разные.
Можно даже три Query сделать, чтобы во втором запрос постоянно не переписывать.

Кстати, если движок таблиц InnoDB и автокоммит выключен, то коммит делать не забывайте.
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38617991
useronforum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня не находит IMAGE по ID и CODE.
Может нужны кавычки где-нибудь
или индекс не правильно указал?

Код: pascal
1.
2.
3.
4.
5.
      query_result_image := MySQL.Query(
        'SELECT IMAGE FROM MyTable ORDER BY CODE, NUM, DATE1' +
        ' WHERE CODE = ' + query_result.ValueByName['CODE'] +
        ' and NUM = ' + query_result.ValueByName['NUM']
        );
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38617994
useronforum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,
авторКстати, если движок таблиц InnoDB и автокоммит выключен, то коммит делать не забывайте.
Что такое автокоммит и как делать коммит?
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38618005
useronforum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Заработал поиск IMAGE без сортировки.

Теперь тормозит всё даже на моей маленькой базе с 20 записями.

А я столько кода уже переписал...
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38618006
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
useronforumУ меня не находит IMAGE по ID и CODE.
Может нужны кавычки где-нибудь
или индекс не правильно указал?

Код: pascal
1.
2.
3.
4.
5.
      query_result_image := MySQL.Query(
        'SELECT IMAGE FROM MyTable ORDER BY CODE, NUM, DATE1' +
        ' WHERE CODE = ' + query_result.ValueByName['CODE'] +
        ' and NUM = ' + query_result.ValueByName['NUM']
        );

Уберите секцию ORDER BY, она тут не нужна. Во-первых, по синтаксису она ставится после WHERE. Во-вторых, здесь все равно не может быть выбрано более одной записи, так что сортировать просто нечего.

И научитесь ловить исключения или проверять возвращаемые ошибки, чтобы не пропустить сигнал от MySQL о неправильном синтаксисе запроса.
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38618008
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
useronforummiksoft,
авторКстати, если движок таблиц InnoDB и автокоммит выключен, то коммит делать не забывайте.
Что такое автокоммит и как делать коммит?Похоже, что пока это неважно.
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38618009
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
useronforumЗаработал поиск IMAGE без сортировки.

Теперь тормозит всё даже на моей маленькой базе с 20 записями.Итоговый код покажите
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38618014
useronforum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

а индекс правильно указан:
Код: pascal
1.
ORDER BY CODE, NUM, DATE1


C пробелами, запятыми и без общих кавычек?

Порядок полей важен?

Может индекс можно только по имени указывать, а не перечислением полей?
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38618015
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
useronforummiksoft,

а индекс правильно указан:
Код: pascal
1.
ORDER BY CODE, NUM, DATE1



C пробелами, запятыми и без общих кавычек?

Порядок полей важен?

Может индекс можно только по имени указывать, а не перечислением полей?ORDER BY - это не индекс, это указание как сортировать результат запроса. Оно может выполняться и при наличии индекса, и без него. Порядок полей был бы важен, если бы сам этот ORDER BY был важен.
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38618019
useronforum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторORDER BY - это не индекс, это указание как сортировать результат запроса. Оно может выполняться и при наличии индекса, и без него. Порядок полей был бы важен, если бы сам этот ORDER BY был важен.

В первом запросе порядок важен
Код: c#
1.
2.
    query_result := MySQL.Query(
      'SELECT CODE, NUM FROM MyTable ORDER BY CODE, NUM, DATE1 LIMIT ' + IntToStr(Limit1) + ' OFFSET ' + IntToStr(offset1));



Индекс автоматически задействуется, если ORDER BY указан по полям как в индексе, или нет?
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38618025
useronforum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А не должны ли обязательно быть в SELECT перечислены все те поля, которые есть в ORDER BY?
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38618027
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
useronforumавторORDER BY - это не индекс, это указание как сортировать результат запроса. Оно может выполняться и при наличии индекса, и без него. Порядок полей был бы важен, если бы сам этот ORDER BY был важен.

В первом запросе порядок важен
Код: c#
1.
2.
    query_result := MySQL.Query(
      'SELECT CODE, NUM FROM MyTable ORDER BY CODE, NUM, DATE1 LIMIT ' + IntToStr(Limit1) + ' OFFSET ' + IntToStr(offset1));




Индекс автоматически задействуется, если ORDER BY указан по полям как в индексе, или нет?Да, в таком запросе порядок важен.
В первую очередь он зависит от задачи, чтобы был правильный результат.
Во вторую очередь желательно, чтобы порядок полей совпадал с порядком полей в начале индекса. Тогда этот индекс может быть использован для сортировки.

Поле DATE1 из ORDER BY уберите, все равно оно не идет в результат. Да и на сортировку не влияет.

А вот зачем тут LIMIT - не понятно.
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38618029
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
useronforumА не должны ли обязательно быть в SELECT перечислены все те поля, которые есть в ORDER BY?Нет, вообще эти списки полей могут даже не пересекаться.
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38618034
useronforum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторПоле DATE1 из ORDER BY уберите, все равно оно не идет в результат. Да и на сортировку не влияет.

А вот зачем тут LIMIT - не понятно.
Поле DATE1 в ORDER BY есть, так как оно есть в индексе.

LIMIT на всякий случай ставлю из Edit.
Если будет переполнение памяти, то поставлю 1 и проверю сразу же.

авторавторА не должны ли обязательно быть в SELECT перечислены все те поля, которые есть в ORDER BY?
Нет, вообще эти списки полей могут даже не пересекаться.
Но почему то не работал:
Код: pascal
1.
2.
3.
4.
5.
     query_result_image := MySQL.Query(
        'SELECT IMAGE FROM MyTable ORDER BY CODE, NUM, DATE1' +
        ' WHERE CODE = ' + query_result.ValueByName['CODE'] +
        ' and NUM = ' + query_result.ValueByName['NUM']
        );
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38618035
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
useronforum,

15898007
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38618038
useronforum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

Забыл.

===
А LIMIT 1 не ускорит запрос, если запись всегда 1?
Код: pascal
1.
2.
3.
MySQL.ExecSQL('UPDATE MyTable SET MyTable.IMAGE="' + b +
              '" WHERE CODE = ' + query_result.ValueByName['CODE'] +
              ' and NUM = ' + query_result.ValueByName['NUM']);
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38618039
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
useronforumА LIMIT 1 не ускорит запрос, если запись всегда 1?нет.
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38618047
useronforum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ладно, на сегодня всё.

Моя программа по крайней мере у меня стала грузить процессор намного сильнее.

Завтра проверю на реальной базе.

Если что интересное получится - напишу.

Всем спасибо за помощь.
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38618048
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
useronforumМоя программа по крайней мере у меня стала грузить процессор намного сильнее.Так это же хорошо. Она делом занялась, а не простаивает.
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38618054
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft , крепкие нервы....
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38618218
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяmiksoft , крепкие нервы....+1
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38618650
useronforum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем после оптимизации всё стало намного медленнее работать.
1 запись изменяется по 2 минуты.
И за месяц так не обработается.


Я везде комментарии с сообщениями поставил.
Тормозит запрос
Код: pascal
1.
2.
3.
4.
5.
6.
      query_result_image := MySQL.Query(
        'SELECT IMAGE FROM MyTable' +
        ' WHERE CODE = ' + query_result.ValueByName['CODE'] +
        ' and NUM = ' + query_result.ValueByName['NUM'] +
        ' ORDER BY BARCODE, PHOTO_NUM, DATE_INS'
        );



Думаю сортировка по индексу не применяется,
и тратятся ресурсы на поддержку сортировки по 3 полям,
хотя ЭТОТ ЗАПРОС ВСЕГДА ВОЗВРАЩАЕТ 1 ЗАПИСЬ (200 Кб - 3 Мб).
Наверно лучше без сортировки.

А есть ли метод "FIND FIRST" в языке SQL чтобы использовать вместо SELECT многих записей?

И какой наиболее быстрый способ загрузки BLOB-поля из файла,
с учётом, что я могу программу локально на сервере запустить?

===
Подозреваю, что есть какое-то ограничение на скорость передачи данных,
ведь все данные передаются по сетевому протоколу хоть и внутри 1 компьютера,
а интернет у нас не быстрый).
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38618701
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
useronforumТормозит запрос
Код: pascal
1.
2.
3.
4.
5.
6.
      query_result_image := MySQL.Query(
        'SELECT IMAGE FROM MyTable' +
        ' WHERE CODE = ' + query_result.ValueByName['CODE'] +
        ' and NUM = ' + query_result.ValueByName['NUM'] +
        ' ORDER BY BARCODE, PHOTO_NUM, DATE_INS'
        );

Знаете... мои нервы хоть и были отмечены выше, но они тоже заканчиваются.
Зачем здесь вообще сортировка?
Уберите сортировку, соберите запрос в строковую переменную, выведите ее на экран или еще куда-нибудь. Затем подключитесь к MySQL консольным или GUI-клиентом или PHPMyAdmin-ом и посмотрите план этого запроса. После этого показывайте нам запрос и его план.
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38618825
useronforum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сортировку убрал, скорость почти не изменилась.

Но когда добавил "LIMIT 1" скорость заметно возросла
(но сильно уменьшается при приближении к концу таблицы)

авторЗатем подключитесь к MySQL консольным или GUI-клиентом или PHPMyAdmin-ом и посмотрите план этого запроса. После этого показывайте нам запрос и его план.
Это как?
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38618864
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
useronforumНо когда добавил "LIMIT 1" скорость заметно возрослаЛибо вы что-то путаете, либо изначальная установка "каждая запись уникальна по паре значений CODE и NUM" неверна.
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38618869
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
useronforumЭто как?Посмотреть план запроса можно, например, добавив перед ним слово EXPLAIN.
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38618893
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и покажи код по аналогии с 1 постом
в чем тормоза?
в обработке дельфи или mysql сервера?
можешь / умеешь пользоваться пошаговой отладкой?
поставь таймеры - определи какой кусок кода работает дольше

авторНо когда добавил "LIMIT 1" скорость заметно возросла
ты что-то скрываешь
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38618951
useronforum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: pascal
1.
2.
3.
4.
SELECT IMAGE FROM MyTable' +
        ' WHERE CODE = ' + query_result.ValueByName['CODE'] +
        ' and NUM = ' + query_result.ValueByName['NUM'] +
        ' LIMIT 1'



EXPLAIN
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
table: "MyTable"
type: "ALL"
possible_keys: "PRIMARY,CODE"
key: ""
key_len: ""
ref: ""
rows: "51956"
Extra: "Using where"



Смущает rows. В таблице меньше записей кажется.

авторавторНо когда добавил "LIMIT 1" скорость заметно возросла
Либо вы что-то путаете, либо изначальная установка "каждая запись уникальна по паре значений CODE и NUM" неверна.
Уникальна практически, но как уникальная возможно не установлена (как ключ).

авторможешь / умеешь пользоваться пошаговой отладкой?
поставь таймеры - определи какой кусок кода работает дольше
Использую. С их помощью определил, что именно этот запрос тормозит.
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38619004
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так проверь
Код: sql
1.
2.
SELECT IMAGE FROM MyTable' +
        ' WHERE CODE = ' + query_result.ValueByName['CODE']



и соответсвенно поправиь везде

и код приведи с делфи
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38619011
useronforum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя,
Не правильно.
Есть записи с одинаковым CODE, но разным NUM.
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38619031
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
useronforumEXPLAIN
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
table: "MyTable"
type: "ALL"
possible_keys: "PRIMARY,CODE"
key: ""
key_len: ""
ref: ""
rows: "51956"
Extra: "Using where"


Смущает rows. В таблице меньше записей кажется.useronforumПро ключи узнал:
PRIMARY KEY (`CODE`,`NUM`,`DATE1`).Не верю.
Либо ключа нет, либо он не такой, либо запрос не такой. Покажите итоговый запрос, а не выражение, его вычисляющее.

P.S. Количество записей примерное, это оценка.
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38619032
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
выложи DDL таблицы MyTable
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38619065
useronforum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторавторПро ключи узнал:
PRIMARY KEY (`CODE`,`NUM`,`DATE1`).
Не верю.
Либо ключа нет, либо он не такой, либо запрос не такой. Покажите итоговый запрос, а не выражение, его вычисляющее.
Посмотрел сторонней программой. Пишет:
Indexes: CODE
Fields: CODE
Index method: BTREE

Foreign keys:
Name: photo
Fields: CODE

Ранее смотрел другой программой, там по другому кажется написано было,
но я тогда мог перепутать индекс с текущей сортировкой.

Попробую сортировку по CODE.

===
Обнаружил триггер на таблице:

В OnUpdate таблицы:

BEGIN
UPDATE `list` SET `posted` = 0 WHERE CODE = NEW.`CODE`;
END


Казалось бы проблема найдена,
НО
тормозит чтение BLOB-поля, а не запись нового значения его.

Или теоретически возможно, что я отправляю update,
а когда следом читаю SELECT, то MySQL ещё выполняет этот триггер,
и поэтому тормозит загрузка данных?

===
А возможно ли временно отключить триггер,
а потом включить не удаляя?
Если да, то как?
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38619066
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
useronforum,

покажите результат запроса CREATE TABLE MyTable
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38619086
useronforum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я такой запрос выполнить не могу.
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38619111
useronforum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А можно ли создать триггеры через SQL-запрос?

А то я их отключил, а они удалились при этом.
(копию их кода я из резервной копии потом попробую восстановить.)
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38619125
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
useronforumЯ такой запрос выполнить не могу.Что мешает?
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38619126
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
useronforumА можно ли создать триггеры через SQL-запрос?

А то я их отключил, а они удалились при этом.
(копию их кода я из резервной копии потом попробую восстановить.)Отключения триггеров в MySQL нет, только удаление и создание.

Триггера только через SQL-запрос и можно создать, иначе никак.

Но это явно не причина медленного чтения из таблицы. Причина - отсутствие подходящего индекса.
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38619146
useronforum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А может индекс временно создать,
обработать все BLOB и индекс удалить?

===
Долго ли будет создаваться индекс для БД 3 Гб и как узнать,
что он создался и все записи проиндексированы?
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38619154
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
useronforumА может индекс временно создать,
обработать все BLOB и индекс удалить?Можно и так, если обработка нужна один раз, а не регулярно.
useronforumДолго ли будет создаваться индекс для БД 3 Гбдостаточно быстро, сам индекс-то получится маленький.
useronforumкак узнать,
что он создался и все записи проиндексированы?Выдаст в конце "ОК", значит все записи проиндексированы. В противном случае выдаст ошибку.
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38619162
useronforum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А какие запросы к БД создают триггер и индекс?

Напишите примеры запроса для MySQL, чтобы мне долго не искать.
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38619165
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftuseronforumЯ такой запрос выполнить не могу.Что мешает?
?????
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38619169
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
useronforumА какие запросы к БД создают триггер и индекс?

Напишите примеры запроса для MySQL, чтобы мне долго не искать.А вы ищите быстро :)
У MySQL вполне приличная документация и она неплохо структурирована.
CREATE TRIGGER
Trigger Syntax and Examples
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38619178
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
скачай db forge и не майся
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38619240
useronforum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем одной программой удалил триггеры,
а создать заново она их не может.

Пришлось другой создавать (HeidiSQL).

К счастью создались.

===
Про индексы:

Программа пишет:
Код: pascal
1.
2.
3.
	PRIMARY KEY (`CODE`, `NUM`, `DATE1`),
	INDEX `CODE` (`CODE`),
	CONSTRAINT `photo` FOREIGN KEY (`CODE`) REFERENCES `code` (`CODE`)



А как в SQL запросе сказать, что нужно использовать индекс?
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38619254
useronforum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем запрос теперь такой:
Код: pascal
1.
2.
3.
4.
5.
6.
      query_result_image := MySQL.Query(
        'SELECT IMAGE FROM MyTable' +
        ' WHERE CODE = ' + query_result.ValueByName['CODE'] +
        ' and NUM = ' + query_result.ValueByName['NUM'] +
        ' ORDER BY CODE, NUM LIMIT 1'
        );



Создал дополнительный индекс CODE_NUM по полям CODE, NUM,
но это судя по всему не повлияло.

Но при использовании ORDER BY CODE, NUM
EXPLAIN стало возвращать:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
table: "MyTable"
type: "index"
possible_keys: "PRIMARY,CODE_NUM,CODE"
key: "PRIMARY"
key_len: "39"
ref: "" / rows: "52860"
Extra: "Using where"



Завтра опять буду пробовать на настоящей базе данных.
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38619258
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
useronforumВ общем запрос теперь такой:miksoftПокажите итоговый запрос, а не выражение, его вычисляющее.
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38619285
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
useronforum,

покажите результат запроса
Код: sql
1.
SHOW CREATE TABLE MyTable 
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38619286
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это лишнее
' ORDER BY CODE, NUM LIMIT 1'
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38619502
useronforum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторmiksoft
Покажите итоговый запрос, а не выражение, его вычисляющее.
Итоговый запрос:
Код: pascal
1.
2.
3.
 
SELECT IMAGE FROM MyTable WHERE CODE = 000000021 and NUM = 2
ORDER BY CODE, NUM, DATE1 ORDER BY CODE, NUM LIMIT 1


В структуре таблицы:
CODE - CHAR (9)
NUM - CHAR (22)
DATE1 - datetime
IMAGE - mediumblob

авторЗавтра опять буду пробовать на настоящей базе данных.
Скорость работы:
В общем работать с ORDER BY CODE, NUM LIMIT 1 стало намного быстрее: 1 запись в секунду.

Но работа сильно замедляется при продвижении по таблице.

После 10% всех записей 1 запись обрабатывается уже 20-60 сек.

Причём, если в начале основное время тратится на получение BLOB (SELECT IMAGE),
а отправка нового значения выполняется очень быстро,
то после 10%, и получение BLOB и отправка нового BLOB,
выполняются уже почти одинаково медленно по 20-30 сек.

Все ресурсы занимает сервер MySQL,
моя программа 0-2% CPU.

===
Говорю 10% всех записей, так как дальше я не стал ждать,
а оставил программу запущенной и ушёл.
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38619504
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
useronforum
Код: pascal
1.
ORDER BY CODE, NUM, DATE1 ORDER BY CODE, NUM

И это работает? не верю.
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38619522
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2useronforum
кончай хернёй заниматься
выполни
Код: sql
1.
SHOW CREATE TABLE MyTable 


и результат покажи

Код: sql
1.
ORDER BY CODE, NUM, DATE1 ORDER BY CODE, NUM LIMIT 1


гыгыгыг
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38620282
useronforum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема решилась

В общем проблема была в том, что индекс используется
только если выполняется поиск СРАЗУ ПО ВСЕМ ПОЛЯМ, ВХОДЯЩИМ В ИНДЕКС.

То есть даже несмотря на то, что такие запросы
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
 query_result_image := MySQL.Query(
        'SELECT `IMAGE` FROM `MyTable`' +
        ' WHERE `CODE`=''' + query_result.ValueByName['CODE'] + '''' +
        ' AND `NUM`=''' + query_result.ValueByName['NUM'] + ''''
        );

MySQL.ExecSQL('UPDATE MyTable SET MyTable.IMAGE="' + NewBLOB +
        '" WHERE CODE = ' + query_result.ValueByName['CODE'] +
        ' AND NUM = ' + query_result.ValueByName['NUM']);


всегда ищут и изменяют только 1 запись с точки зрения логики программы,
но так как в главный индекс входят 3 поля
Код: pascal
1.
PRIMARY KEY (`CODE`,`NUM`,`DATE1`).


то нужно выполнять поиск и изменение по всем 3 полям
(иначе индекс не задействуется).

То есть правильный вариант:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
query_result_image := MySQL.Query(
        'SELECT `IMAGE` FROM `MyTable`' +
        ' WHERE `CODE`=''' + query_result.ValueByName['CODE'] + '''' +
        ' AND `NUM`=''' + query_result.ValueByName['NUM'] + '''' +
        ' AND `DATE1`=''' + query_result.ValueByName['DATE1'] + ''''
        );

MySQL.ExecSQL('UPDATE `MyTable` SET `MyTable`.`IMAGE`="' + NewBLOB  +
        '" WHERE `CODE`=''' + query_result.ValueByName['CODE'] + '''' +
        ' AND `NUM`=''' + query_result.ValueByName['NUM'] + '''' +
        ' AND `DATE1`=''' + query_result.ValueByName['DATE1'] + ''''
        );



После этого вся база данных обработалась за 2 часа (а не за 7 дней).

Всем спасибо за помощь.
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38620290
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
useronforumиндекс используется
только если выполняется поиск СРАЗУ ПО ВСЕМ ПОЛЯМ, ВХОДЯЩИМ В ИНДЕКС.Не должно быть такого...
Можете указать точную версию MySQL ?
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38621831
useronforum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторавториндекс используется
только если выполняется поиск СРАЗУ ПО ВСЕМ ПОЛЯМ, ВХОДЯЩИМ В ИНДЕКС.
Не должно быть такого...
Можете указать точную версию MySQL ?
MySQL 5.0.51

И LIMIT 1 вы говорили, что не должно увеличить быстродействие,
если возвращается только 1 запись,
а оно сильно увеличивалось для записей находящихся в начале таблицы,
так как индекс не задействовался и без LIMIT 1 поиск продолжался
после нахождения записи (сейчас с индексом не влияет).

Так что теория иногда с практикой расходятся.
(Но думаю это заметно только при наличии больших BLOB-полей)
...
Рейтинг: 0 / 0
Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
    #38621844
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
useronforumвы говорилия-то говорил... но вот имплементировали вы мое говорение, мягко говоря, очень приблизительно.
Поэтому при случае попробую поставить эксперимент для сходных условий.

P.S. И, кстати, MySQL неплохо бы обновить. 6 лет уж ему... и ветка 5.0 давно не поддерживается...
...
Рейтинг: 0 / 0
85 сообщений из 85, показаны все 4 страниц
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Быстрое попеременное чтение и изменение BLOB-записей таблицы в базе данных MySQL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]