powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / помогите ускорить хранимку, или запрос
25 сообщений из 37, страница 1 из 2
помогите ускорить хранимку, или запрос
    #39930152
vde69
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
написал хранимку, по функционалу она полностью меня устраивает.... все хорошо работало на небольших выборках, сейчас у меня выборки примерно по 10...20 тысяч строк, в каждой строке данная хранимка обрабатывает 5 полей (каждое из полей сравнивает с одним общим ключем полученным из вне), время выполнения сейчас примерно 20 сек (с учетом, что это не сервер а NAS у меня нет возможности бороть проблему железом), в перспективе выборка будет расти, надо расчитывать на х10,

возможно будут советы по оптимизации таблицы?

вот хранимка
Код: sql
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.
CREATE DEFINER=`root`@`localhost` FUNCTION `compare_key_9`(`key1` CHAR(9), `key2` CHAR(9)) RETURNS tinyint(4)
BEGIN
DECLARE R INT DEFAULT 0;
DECLARE i INT DEFAULT 1;
DECLARE a INT;
DECLARE b INT;


WHILE i<=LENGTH(key1) DO
    
	Set a = LOCATE(SUBSTRING(key1, i, 1),"0123456789abcdefghijklmnopqrstuvwxyz")-1;
	Set b = LOCATE(SUBSTRING(key2, i, 1),"0123456789abcdefghijklmnopqrstuvwxyz")-1;
    Set a = ABS(a-b)*ABS(a-b);
    
	IF a>100 THEN
	    Set R = R + 100;
   	ELSE
	    Set R = R + a;
   	END IF;    

	SET i=i+1;
END WHILE;

Set R = 100 - R / LENGTH(key1);

RETURN (R);
END


вот таблица,
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TABLE IF NOT EXISTS `Files_CRC` (
	`ID_Files` int(11) NOT NULL,
	`CRC` char(32) NOT NULL,
	`Key_Main` varchar(526) NOT NULL,
	`Key_red` char(9) NOT NULL,
	`Key_green` char(9) NOT NULL,
	`Key_blue` char(9) NOT NULL,
	`Key_grey` char(9) NOT NULL,
	`Key_color` char(9) NOT NULL
)


--------------------------------------------------------
Хороший программист должен уметь не только пользоваться инструментами, но и уметь обходиться БЕЗ НИХ!
...
Рейтинг: 0 / 0
помогите ускорить хранимку, или запрос
    #39930174
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vde69
Код: sql
1.
Set a = ABS(a-b)*ABS(a-b);

Хоть это и копейки, но ABS тут не нужен.
...
Рейтинг: 0 / 0
помогите ускорить хранимку, или запрос
    #39930178
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Значения всегда строго 9-символьные?
Почему CHAR(9), не VARCHAR(9) ?
...
Рейтинг: 0 / 0
помогите ускорить хранимку, или запрос
    #39930203
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думаю, что намного разумнее описывать ЗАДАЧУ. CREATE TABLE есть, дайте к нему INSERT INTO с примером данных и желаемый ответ на именно этих данных, с пояснением, что собственно считается и как.
...
Рейтинг: 0 / 0
помогите ускорить хранимку, или запрос
    #39930252
vde69
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft
Значения всегда строго 9-символьные?
Почему CHAR(9), не VARCHAR(9) ?


да всегда 9 символов, это своеобразный хеш

miksoft
Хоть это и копейки, но ABS тут не нужен.


попробую
...
Рейтинг: 0 / 0
помогите ускорить хранимку, или запрос
    #39930256
vde69
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina
есть, дайте к нему I


у меня не инсерт а селект, ну примерно вот такой, в нем наверно есть ошибки, собирал из кода PHP
Код: sql
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.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
SELECT DISTINCT T10.*, T20.*, c.*
FROM Files T10
	INNER JOIN 
		(
            
            
            
SELECT T0.*, (T0.k_red+T0.k_green+T0.k_blue+T0.k_grey+T0.k_color) AS k_sum from (
    
    
						SELECT ID_Files
							 , compare_key_9(Key_red,   "1e43f4333") as k_red
							 , compare_key_9(Key_green, "5543f4335") as k_green
							 , compare_key_9(Key_blue,  "bbb3f4337") as k_blue
							 , compare_key_9(Key_grey,  "1777f4333") as k_grey
							 , compare_key_9(Key_color, "1e4399933") as k_color
						FROM Files_CRC 	
    
    
    
    ) T0 
					WHERE 
						(	    T0.k_red > 70
							and T0.k_green > 70
							and T0.k_blue > 70
							and T0.k_grey > 70
							and T0.k_color > 70
							and (  T0.k_red > 90
								or T0.k_green > 90						
								or T0.k_blue > 90						
								or T0.k_grey > 90						
								or T0.k_color > 90)						
						)
						or 
						(      T0.k_red > 97
							or T0.k_green > 97						
							or T0.k_blue > 97						
							or T0.k_grey > 97	
							or T0.k_color > 97)            
            
            
            ) T20 
	ON T10.ID = T20.ID_Files 
	ORDER BY T20.k_sum DESC
	LIMIT 0,10
...
Рейтинг: 0 / 0
помогите ускорить хранимку, или запрос
    #39930305
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vde69
у меня не инсерт а селект

Я просил (читайте по буквам) INSERT INTO с примером данных .
Ещё лучше - сразу ссылку на fiddle. Вот как тут или тут . И видно, с чем работаем, и запрос попробовать можно...
...
Рейтинг: 0 / 0
помогите ускорить хранимку, или запрос
    #39930323
vde69
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina
vde69
у меня не инсерт а селект

Я просил (читайте по буквам) INSERT INTO с примером данных .
Ещё лучше - сразу ссылку на fiddle. Вот как тут или тут . И видно, с чем работаем, и запрос попробовать можно...


Отчасти я понимаю чего Вы хотите, сделать копию и покрутить на ней на реальных данных, но тут проблема, что 100 записей ровным образом ничего не показывают, скорость выполнения менее 0.1 сек, да и сам запрос очень простой (ниже переформатировал его в красивый вид), я понимаю, что у меня идет фул скан с примерно с 50тыс вызовами моей ХП, проблема исключительно в этом.

Тут вопрос как-бы в другом, может как-то переделать хранимку и сделать ее не на 2 параметра а сразу на 10 (на 1 строчку), или вообще вложеный селект поместить вовнутрь хранимки и там в цикле формировать?

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

мой запрос
Код: sql
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.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
SELECT 
  DISTINCT T10.*, 
  T20.*, 
  c.* 
FROM 
  Files T10 
  INNER JOIN (
    SELECT 
      T0.*, 
      (
        T0.k_red + T0.k_green + T0.k_blue + T0.k_grey + T0.k_color
      ) AS k_sum 
    from 
      (
        SELECT 
          ID_Files, 
          compare_key_9(Key_red, "1e43f4333") as k_red, 
          compare_key_9(Key_green, "5543f4335") as k_green, 
          compare_key_9(Key_blue, "bbb3f4337") as k_blue, 
          compare_key_9(Key_grey, "1777f4333") as k_grey, 
          compare_key_9(Key_color, "1e4399933") as k_color 
        FROM 
          Files_CRC
      ) T0 
    WHERE 
      (
        T0.k_red > 70 
        and T0.k_green > 70 
        and T0.k_blue > 70 
        and T0.k_grey > 70 
        and T0.k_color > 70 
        and (
          T0.k_red > 90 
          or T0.k_green > 90 
          or T0.k_blue > 90 
          or T0.k_grey > 90 
          or T0.k_color > 90
        )
      ) 
      or (
        T0.k_red > 97 
        or T0.k_green > 97 
        or T0.k_blue > 97 
        or T0.k_grey > 97 
        or T0.k_color > 97
      )
  ) T20 ON T10.ID = T20.ID_Files 
ORDER BY 
  T20.k_sum DESC 
LIMIT 
  0, 10
...
Рейтинг: 0 / 0
помогите ускорить хранимку, или запрос
    #39930327
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vde69
Код: sql
1.
"0123456789abcdefghijklmnopqrstuvwxyz"

А обязательно использовать именно эту последовательность?
...
Рейтинг: 0 / 0
помогите ускорить хранимку, или запрос
    #39930329
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vde69
100 записей ровным образом ничего не показывают
Во-первых, просмотр плана никто не отменял. Тем более что всё равно именно в него и придётся упереться.
Во-вторых, дамп пять тысяч записей мы уже с одним товарищем крутили.
В третьих, таблицу с полумиллионом рандомов, нагенерённых в СТЕ, мы тоже крутили (с другим, правда, товарищем).
...
Рейтинг: 0 / 0
помогите ускорить хранимку, или запрос
    #39930331
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
    WHERE 
      (
        T0.k_red > 70 
        and T0.k_green > 70 
        and T0.k_blue > 70 
        and T0.k_grey > 70 
        and T0.k_color > 70 
        and (
          T0.k_red > 90 
          or T0.k_green > 90 
          or T0.k_blue > 90 
          or T0.k_grey > 90 
          or T0.k_color > 90
        )
      ) 
      or (
        T0.k_red > 97 
        or T0.k_green > 97 
        or T0.k_blue > 97 
        or T0.k_grey > 97 
        or T0.k_color > 97
      )


это
Код: sql
1.
2.
3.
WHERE (     LEAST(T0.k_red,T0.k_green,T0.k_blue,T0.k_grey,T0.k_color) > 70
        AND GREATEST(T0.k_red,T0.k_green,T0.k_blue,T0.k_grey,T0.k_color) > 90
      ) OR GREATEST(T0.k_red,T0.k_green,T0.k_blue,T0.k_grey,T0.k_color) > 97
...
Рейтинг: 0 / 0
помогите ускорить хранимку, или запрос
    #39930332
vde69
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft
vde69
Код: sql
1.
"0123456789abcdefghijklmnopqrstuvwxyz"


А обязательно использовать именно эту последовательность?


нет, но желательно... дело в том, что по нему изначально формируются записанные ключи.

в кратце условие у меня было такое - 1 символ до 32 значений, сейчас реально используется 16, но в будующем возможно увеличу разрядность до планируемых 32, по факту это градиент одной точки, в картинке он 255, но де факто я его пересчитываю к более приемлемым значениям.
...
Рейтинг: 0 / 0
помогите ускорить хранимку, или запрос
    #39930336
vde69
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vde69
miksoft
пропущено...
А обязательно использовать именно эту последовательность?


нет, но желательно... дело в том, что по нему изначально формируются записанные ключи.

в кратце условие у меня было такое - 1 символ до 32 значений, сейчас реально используется 16, но в будующем возможно увеличу разрядность до планируемых 32, по факту это градиент одной точки, в картинке он 255, но де факто я его пересчитываю к более приемлемым значениям.


стало покрасивее, но скорость примерно та-же 19,7 сек
...
Рейтинг: 0 / 0
помогите ускорить хранимку, или запрос
    #39930337
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vde69
условие у меня было такое - 1 символ до 32 значений, сейчас реально используется 16, но в будующем возможно увеличу разрядность до планируемых 32, по факту это градиент одной точки, в картинке он 255, но де факто я его пересчитываю к более приемлемым значениям.
Но тогда почему символы-то? работайте с байтами, избежите кучи преобразований, и сможете их напрямую вычитать, ибо исчезнет скачок, который сейчас есть между цифрами и буквами.
...
Рейтинг: 0 / 0
помогите ускорить хранимку, или запрос
    #39930338
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ещё - сам текст запроса просто-таки требует, чтобы всякая фигня типа
Код: sql
1.
2.
3.
4.
5.
          compare_key_9(Key_red, "1e43f4333") as k_red, 
          compare_key_9(Key_green, "5543f4335") as k_green, 
          compare_key_9(Key_blue, "bbb3f4337") as k_blue, 
          compare_key_9(Key_grey, "1777f4333") as k_grey, 
          compare_key_9(Key_color, "1e4399933") as k_color 

была рассчитана заранее (см. Generated Columns).
...
Рейтинг: 0 / 0
помогите ускорить хранимку, или запрос
    #39930340
vde69
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina
А ещё - сам текст запроса просто-таки требует, чтобы всякая фигня типа
Код: sql
1.
2.
3.
4.
5.
          compare_key_9(Key_red, "1e43f4333") as k_red, 
          compare_key_9(Key_green, "5543f4335") as k_green, 
          compare_key_9(Key_blue, "bbb3f4337") as k_blue, 
          compare_key_9(Key_grey, "1777f4333") as k_grey, 
          compare_key_9(Key_color, "1e4399933") as k_color 


была рассчитана заранее (см. Generated Columns).


тут единственный вариант сделать предварительно рассчитанную таблицу на очень много сзначений, но это не подходит, допустим в таблице 100к значений, значит в такой таблице будет 100*100/2 лямов .... не мой вариант.
...
Рейтинг: 0 / 0
помогите ускорить хранимку, или запрос
    #39930341
vde69
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina
vde69
условие у меня было такое - 1 символ до 32 значений, сейчас реально используется 16, но в будующем возможно увеличу разрядность до планируемых 32, по факту это градиент одной точки, в картинке он 255, но де факто я его пересчитываю к более приемлемым значениям.
Но тогда почему символы-то? работайте с байтами, избежите кучи преобразований, и сможете их напрямую вычитать, ибо исчезнет скачок, который сейчас есть между цифрами и буквами.


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

сейчас у меня есть более менее читабельный код и возможность проверить например в екселе, если прирост 5% то смысла нет...
...
Рейтинг: 0 / 0
помогите ускорить хранимку, или запрос
    #39930345
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Основной расход - это вызов процедуры (её использование превращает работу с массивами данных в набор тупых итераций) и проистекающие из этого фуллскан и похрен индексы. Так что пока Вы не начнёте мыслить массивами данных, а не итерациями, ни хрена и не получится. И больше 10% никакая оптимизация из ЭТОГО не выдавит - надо менять подход, ибо ты попал в вотчину с иной идеологией.
...
Рейтинг: 0 / 0
помогите ускорить хранимку, или запрос
    #39930347
vde69
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,

спасибо, в целом согласен на 100%, буду думать... пока оставлю как есть, по мере роста проекта может вернусь к проблеме.
...
Рейтинг: 0 / 0
помогите ускорить хранимку, или запрос
    #39930385
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina
vde69
условие у меня было такое - 1 символ до 32 значений, сейчас реально используется 16, но в будующем возможно увеличу разрядность до планируемых 32, по факту это градиент одной точки, в картинке он 255, но де факто я его пересчитываю к более приемлемым значениям.
Но тогда почему символы-то? работайте с байтами, избежите кучи преобразований, и сможете их напрямую вычитать, ибо исчезнет скачок, который сейчас есть между цифрами и буквами.
+1
Даже если бы вместо символьных строк были строки байт со значениями от 0 до N-1, то это сэкономило бы оба LOCATE-а в процедуре.
...
Рейтинг: 0 / 0
помогите ускорить хранимку, или запрос
    #39930386
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vde69
miksoft
Значения всегда строго 9-символьные?
Почему CHAR(9), не VARCHAR(9) ?


да всегда 9 символов, это своеобразный хеш
Тогда можно развернуть цикл (попутно удалив переменную i и вызов LENGTH(key1) ), заменив цикл на 9 однотипных фрагментов кода.
...
Рейтинг: 0 / 0
помогите ускорить хранимку, или запрос
    #39930475
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vde69
с учетом, что это не сервер а NAS у меня нет возможности бороть проблему железом),


Ты рутонул NAS и поднял там MySQL, а теперь жалуешься, что эта жалкая железка медленно работает?
...
Рейтинг: 0 / 0
помогите ускорить хранимку, или запрос
    #39930478
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vde69


возможно будут советы по оптимизации таблицы?


Здесь у тебя просто тупой цикл по длине ключа, тут даже нет работы ни с одной таблицей!
Ты вообще о чём? ЧТО тут можно оптимизировать?
(подсказка: ничего нельзя).
...
Рейтинг: 0 / 0
помогите ускорить хранимку, или запрос
    #39930482
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vde69
vde69
пропущено...


нет, но желательно... дело в том, что по нему изначально формируются записанные ключи.

в кратце условие у меня было такое - 1 символ до 32 значений, сейчас реально используется 16, но в будующем возможно увеличу разрядность до планируемых 32, по факту это градиент одной точки, в картинке он 255, но де факто я его пересчитываю к более приемлемым значениям.


стало покрасивее, но скорость примерно та-же 19,7 сек



Так эта твоя хренотень в принципе неопримизируема. Чего ты ждёшь, чуда?
...
Рейтинг: 0 / 0
помогите ускорить хранимку, или запрос
    #39931313
vde69
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
vde69
пропущено...


стало покрасивее, но скорость примерно та-же 19,7 сек



Так эта твоя хренотень в принципе неопримизируема. Чего ты ждёшь, чуда?


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

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

в голове еще бродят идеи как изменить алгоритм и структуру базы, но им надо отлежатся, пока решения нет, если все-же придумаю как сделать, то вернусь к теме
...
Рейтинг: 0 / 0
25 сообщений из 37, страница 1 из 2
Форумы / MySQL [игнор отключен] [закрыт для гостей] / помогите ускорить хранимку, или запрос
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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