powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / помогите ускорить хранимку, или запрос
37 сообщений из 37, показаны все 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
помогите ускорить хранимку, или запрос
    #39931317
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
ЧТО тут можно оптимизировать?
Убрать цикл (развернуть), убрать вызов LENGTH (там константа), убрать LOCATE-ы (переходом на нормальные байтовые значения вместо символьной шкалы), вычисление (a-b)*(a-b) сделать по необходимости, а не на каждой итерации, сделать досрочный выход из процедуры по достижении некоторого значения R (все равно результат менее 70 не используется)...

При более творческом подходе можно внести секцию WHERE из запроса внутрь функции и вызывать ее один раз, а не пять (или более)...

В пределе написать свою внешнюю функцию на С++
Adding a User-Defined Function
Adding a Native Function

В идеале, наверное, уходить от SQL, а делать какое-то другое решение. В частности, распараллелить по процам/ядрам. Запрос (точнее говоря, его алгоритмический аналог) должен хорошо параллелиться.
...
Рейтинг: 0 / 0
помогите ускорить хранимку, или запрос
    #39931321
vde69
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

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

по поводу переписать на с++ тут не все так просто, у меня мускуль предустановлен и установка там хитрая с использованием виртуальных дисков которые сбрасываются при перезагрузки и востанавливаются из пзу. Конечно способы есть, но я не хочу ломать штатную (и достаточно сбалансированую) систему
...
Рейтинг: 0 / 0
помогите ускорить хранимку, или запрос
    #39931323
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vde69
кстати про распоралелить - это вполне реально для меня, единственное я не понимаю даст это прирост именно на моей жлезяке или нет, но я попробую, посмотрю...
Можно распараллелить весь запрос оставаясь в рамках SQL, хотя это и не просто. Т.е. выполнять запрос одновременно в N сессиях, но каждый из отдельных запросов должен обрабатывать 1/N долю таблицы Files_CRC.

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

Код: 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.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
SELECT 
  DISTINCT T10.*, 
  T20.* 
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, 
          sum(k_red) as k_red, 
          sum(k_green) as k_green, 
          sum(k_blue) as k_blue, 
          sum(k_grey) as k_grey, 
          sum(k_color) as k_color
        FROM 
          (
            SELECT 
              ID_Files, 
              compare_key_9(Key_red, "1e43f4333") as k_red, 
              0 as k_green, 
              0 as k_blue, 
              0 as k_grey, 
              0 as k_color 
            FROM 
              Files_CRC 
            UNION ALL 
            SELECT 
              ID_Files, 
              0 as k_red, 
              compare_key_9(Key_green, "5543f4335") as k_green, 
              0 as k_blue, 
              0 as k_grey, 
              0 as k_color
            FROM 
              Files_CRC 
            UNION ALL 
            SELECT 
              ID_Files, 
              0 as k_red, 
              0 as k_green, 
              compare_key_9(Key_blue, "bbb3f4337") as k_blue, 
              0 as k_grey, 
              0 as k_color
            FROM 
              Files_CRC 
            UNION ALL 
            SELECT 
              ID_Files, 
              0 as k_red, 
              0 as k_green, 
              0 as k_blue, 
              compare_key_9(Key_grey, "1777f4333") as k_grey, 
              0 as k_color
            FROM 
              Files_CRC 
            UNION ALL 
            SELECT 
              ID_Files, 
              0 as k_red, 
              0 as k_green, 
              0 as k_blue, 
              0 as k_grey, 
              compare_key_9(Key_color, "1e4399933") as k_color 
             FROM 
               Files_CRC
           ) AS T
               
        GROUP BY ID_Files ) T0 
        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
      ) T20 ON T10.ID = T20.ID_Files 
    ORDER BY 
      T20.k_sum DESC 
    LIMIT 
      0, 10
     
...
Рейтинг: 0 / 0
помогите ускорить хранимку, или запрос
    #39931984
vde69
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
3.5 сек

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
            SELECT 
              ID_Files, 
              compare_key_9(Key_red, "1e43f4333") as k_red, 
              0 as k_green, 
              0 as k_blue, 
              0 as k_grey, 
              0 as k_color 
            FROM 
              Files_CRC 
 
...
Рейтинг: 0 / 0
помогите ускорить хранимку, или запрос
    #39931985
vde69
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть идея сделать таблицу с 2 столбцами которые будут хранить готовое значение 2х символов.

и если разбить все ключи на односимвольные колонки, то все будет работать на чистых джойнах, правда меня смущает добавление 40 колонок
...
Рейтинг: 0 / 0
помогите ускорить хранимку, или запрос
    #39933235
vde69
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
немного переписал (и переделал ключи) стало 10 сек против начальных 20

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
BEGIN
DECLARE R INT DEFAULT 0;
DECLARE i INT DEFAULT 1;
DECLARE a INT;
DECLARE L INT;
SET L = LENGTH(key1);
WHILE i<=L DO
	Set a = ABS(ORD(SUBSTRING(key1, i, 1))-ORD(SUBSTRING(key2, i, 1)));
	IF a>10 THEN Set R = R + 100; ELSE Set R = R + a * a; END IF;    
	SET i=i+1;
END WHILE;
Set R = 100 - R / L;
RETURN (R);
END
...
Рейтинг: 0 / 0
помогите ускорить хранимку, или запрос
    #39933238
vde69
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на будущее наверно буду делать кеширование части результататов в отдельной таблице
...
Рейтинг: 0 / 0
помогите ускорить хранимку, или запрос
    #39933287
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vde69,

Мне кажется, что вызов ABS все-таки дороже, чем умножение a * a.
Ну и кроме этого еще остались резервы...
...
Рейтинг: 0 / 0
помогите ускорить хранимку, или запрос
    #39933744
vde69
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

а какие еще резервы остались?

ps
отказываться от цикла не буду
...
Рейтинг: 0 / 0
помогите ускорить хранимку, или запрос
    #39933747
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vde69
а какие еще резервы остались?
miksoft
сделать досрочный выход из процедуры по достижении некоторого значения R (все равно результат менее 70 не используется)...
Кстати, надо еще на кодировки посмотреть. Возможно, замена CHAR(9) на BINARY(9) что-то даст.

vde69
отказываться от цикла не буду
Почему же? Можно сэкономить 10 сравнений, 9 инкрементов переменной i и около 10 переходов. Впрочем, я не уверен, что это будет заметно на общем фоне.

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

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


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