MySQL запрос выполняется быстро с 200 записями и слишком долго с более чем 200 - PullRequest
0 голосов
/ 06 августа 2020

У меня есть таблица «картинка» с 255 записями для цветов картинки. У меня есть таблица "colors_mixed" с 23897 записями. Мне нужно найти наиболее близкий смешанный цвет ко всем цветам изображения, поэтому я написал запрос:

SELECT m.id
    FROM picture AS p
    INNER JOIN colors_mixed AS m ON 
      (ABS(m.red - p.r) + ABS(m.green - p.g) + ABS(m.blue - p.b))
      = (select min(abs(red - p.r)
                  + abs(green - p.g)
                  + abs(blue - p.b)) from colors_mixed)
    WHERE p.id BETWEEN 1 AND 10

Он работает менее 1 секунды. Если я использую

WHERE p.id BETWEEN 1 AND 150

, он работает около 4 секунд. Но если я использую

WHERE p.id BETWEEN 1 AND 200

или вообще не использую «WHERE», он работает минуту, 2 минуты, и я просто не хочу больше ждать, потому что это должно быть сделано за 5 секунд. То же самое происходит, если я использую обратный порядок -

WHERE p.id BETWEEN 200 and 255

работает нормально, а «МЕЖДУ 50 и 255» просто не останавливается.

Посоветуйте, пожалуйста, как это исправить?

Ответы [ 2 ]

0 голосов
/ 06 августа 2020

Извините, это была ошибка клиента Heidi SQL. Я попробовал другой клиент, и теперь все в порядке.

0 голосов
/ 06 августа 2020

Вы можете попробовать добавить индекс к picture.id. Это сделает ваши запросы намного быстрее. Это синтаксис, который вы должны использовать.

ALTER TABLE tbl ADD INDEX col (col)

В вашем случае вы должны запустить что-то вроде

ALTER TABLE picture ADD INDEX id_index (id)

или попробовать это в другой таблице.

Дополнительную информацию об индексах можно найти здесь: https://www.drupal.org/docs/7/guidelines-for-sql/the-benefits-of-indexing-large-mysql-tables#: ~: text = Создание% 20Indexes & text = Заявление% 20to% 20create% 20index,% 20index% 20must% 20be% 20distinct .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...