Форум программистов, компьютерный форум, киберфорум
MySQL
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
0 / 0 / 0
Регистрация: 27.01.2013
Сообщений: 7
1

Оптимизация запроса с использованием LEFT JOIN

27.01.2013, 20:52. Показов 2478. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет. Который день бьюсь над одной задачей. Помогите пожалуйста.
Существует две таблицы. В одну таблицу заносятся данные о файлах, находящихся в данном дереве (`file`)
MySQL
1
2
3
4
5
6
7
8
9
10
`id` int(10) NOT NULL AUTO_INCREMENT,
  `dirname` varchar(1000) CHARACTER SET utf8 NOT NULL,
  `filename` varchar(1000) CHARACTER SET utf8 NOT NULL,
  `fileextension` varchar(10) CHARACTER SET utf8 NOT NULL,
  `filesize` double(20,1) NOT NULL,
  `filectime` datetime NOT NULL,
  `filemtime` datetime NOT NULL,
  PRIMARY KEY (`id`),
  FULLTEXT KEY `filename` (`filename`),
  FULLTEXT KEY `fileextension` (`fileextension`)
В данный момент в таблицу занесена информация о 4500 файлах.
И вторая таблица, в которую заносятся данные, выдернутые из лог-файла фтп-сервера (`connection`)
MySQL
1
2
3
4
5
6
7
8
9
10
11
12
13
 `id` int(100) NOT NULL AUTO_INCREMENT,
  `connection_id` varchar(10) NOT NULL,
  `account_id` varchar(50) NOT NULL,
  `logname` varchar(100) NOT NULL,
  `ip` varchar(15) NOT NULL,
  `log_filename` varchar(1000) NOT NULL,
  `log_filename_ext` varchar(10) NOT NULL,
  `uplendtime` datetime NOT NULL,
  `sizelastlogin` double(10,2) NOT NULL,
  `uplspeed` int(10) NOT NULL,
  PRIMARY KEY (`id`),
  FULLTEXT KEY `log_filename` (`log_filename`),
  FULLTEXT KEY `log_filename_ext` (`log_filename_ext`)
В данный момент в таблицу занесена информация о 16000 файлах.
Информация в обеих таблицах заполняется примерно на 200-300 новых строк в сутки.
Я вывожу данные из этих двух таблиц следующим запросом:
MySQL
1
SELECT * FROM `file` LEFT JOIN `connection` ON `file`.`filename` = `connection`.`log_filename` ORDER BY `file`.`filectime` DESC, `file`.`id` DESC LIMIT 50
Проблема, собственно, заключается в том, что запрос обрабатывается безумное количество времени. Есть подозрение, что будь сравниваемые столбцы числовыми, все работало бы намного быстрее, но иначе как сравнивать по имени файла, я вариантов не могу найти.
Запрос должен выполняться каждую 1-2 минуты. Может есть какие-либо идеи? Заранее спасибо
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.01.2013, 20:52
Ответы с готовыми решениями:

Убрать дубли при left join + оптимизация запроса
Есть запрос: SELECT count(distinct(product.id)) FROM `product` JOIN `product_to_tag` `p2t` ON...

Запрос к БД с использованием LEFT JOIN
Добрый день дорогие эксперты, профессионалы и любители. Помогите вкурить как сделать правильно,...

Запросы RIGHT JOIN и LEFT JOIN в чём различие?
Добрый день! Чем отличаются запросы RIGHT JOIN и LEFT JOIN, если они выдают один и тот же результат?

Переделать запрос LEFT JOIN -> INNER JOIN
Доброго времени суток, помогите переделать запрос с использованием LEFT JOIN на INNER JOIN ...

11
814 / 797 / 201
Регистрация: 21.09.2012
Сообщений: 2,656
27.01.2013, 21:45 2
Добавить индексы на поля по которым осуществляется поиск
0
0 / 0 / 0
Регистрация: 27.01.2013
Сообщений: 7
27.01.2013, 21:48  [ТС] 3
Индексы добавлены
Цитата Сообщение от snapuk Посмотреть сообщение
MySQL
1
2
3
  
  FULLTEXT KEY `filename` (`filename`),
  FULLTEXT KEY `fileextension` (`fileextension`)
MySQL
1
2
3
  
  FULLTEXT KEY `log_filename` (`log_filename`),
  FULLTEXT KEY `log_filename_ext` (`log_filename_ext`)
0
1931 / 1165 / 424
Регистрация: 31.05.2012
Сообщений: 4,117
27.01.2013, 23:41 4
А зачем полнотекстовой индекс? Обычный индекс по log_filename.
0
0 / 0 / 0
Регистрация: 27.01.2013
Сообщений: 7
27.01.2013, 23:45  [ТС] 5
Цитата Сообщение от Аватар Посмотреть сообщение
А зачем полнотекстовой индекс? Обычный индекс по log_filename.
Там разница несущественная, да и, складывается ощущение, что индексы не срабатывают.
0
1931 / 1165 / 424
Регистрация: 31.05.2012
Сообщений: 4,117
28.01.2013, 08:46 6
а EXPLAIN что говорит?
0
0 / 0 / 0
Регистрация: 27.01.2013
Сообщений: 7
28.01.2013, 13:19  [ТС] 7
Цитата Сообщение от Аватар Посмотреть сообщение
а EXPLAIN что говорит?
Вот
Миниатюры
Оптимизация запроса с использованием LEFT JOIN  
0
1931 / 1165 / 424
Регистрация: 31.05.2012
Сообщений: 4,117
28.01.2013, 14:14 8
Никакие индексы не используютя и нет тех, которые могли бы использоваться

А без ORDER и LIMIT что EXPLAIN говорит?

И с наличием обычного индекса по log_filename что выдает?
0
Хелпер
28.01.2013, 14:19 9
Цитата Сообщение от snapuk Посмотреть сообщение
Есть подозрение, что будь сравниваемые столбцы числовыми, все работало бы намного быстрее, но иначе как сравнивать по имени файла, я вариантов не могу найти.
Это можно обойти добавлением таблицы имен файлов
id, filename

и добавлять в эти таблицы ID файла, а когда понадобится уже вытаскивать нормальное имя из этой таблицы.
0 / 0 / 0
Регистрация: 27.01.2013
Сообщений: 7
28.01.2013, 16:01  [ТС] 10
Цитата Сообщение от Аватар Посмотреть сообщение
Никакие индексы не используютя и нет тех, которые могли бы использоваться

А без ORDER и LIMIT что EXPLAIN говорит?

И с наличием обычного индекса по log_filename что выдает?
Вот
Миниатюры
Оптимизация запроса с использованием LEFT JOIN   Оптимизация запроса с использованием LEFT JOIN  
0
1931 / 1165 / 424
Регистрация: 31.05.2012
Сообщений: 4,117
28.01.2013, 18:07 11
1. FULLTEXT индекс не будет использоваться с таким запросом при всем твоем желании (только с синтаксисом MATCH … AGAINST).
2. Обычный индекс должен использоваться, другое дело его можно сделать по части поля
3. Хелпер дело предлагает, такое устройство базы будет оптимальней
0
0 / 0 / 0
Регистрация: 27.01.2013
Сообщений: 7
29.01.2013, 01:45  [ТС] 12
Забавный момент, если сделать наоборот, то есть поиск по таблице с 16000 записей и к ней джойнить, то запрос выполняется за 0.04 секунды. Почему такая разница получается?

Добавлено через 2 часа 33 минуты
Цитата Сообщение от Хелпер Посмотреть сообщение
Это можно обойти добавлением таблицы имен файлов
id, filename

и добавлять в эти таблицы ID файла, а когда понадобится уже вытаскивать нормальное имя из этой таблицы.
А мне нравится. Думаю, так и сделаю. Спасибо
0
29.01.2013, 01:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.01.2013, 01:45
Помогаю со студенческими работами здесь

LEFT JOIN странно влияет на результат запроса
Вопрос скорее теоретического характера. Есть 2 таблицы, связанные через 4 поля-ключа. В каждой по...

Удаление записи из нескольких таблиц с использованием LEFT JOIN (MS SQL)
Добрый день! У меня в базе MS SQL связаны между собой 4 таблицы, связаны они по коду, мне...

Оптимизация запроса без Join в таблице с 4 млн записей
Добрый день, друзья. Прошу помощи в оптимизации следующего запроса. Упростил как мог, оставив...

Как записать Left Join (Right Join) при помощи Linq, используя fluent-синтаксис
Как записать Left Join (Right Join) при помощи Linq используя fluent - синтаксис? У меня есть...

Ошибка "Integrity constraint violation" при запросе INNER JOIN LEFT JOIN
это запрос на вывод категорий в каждой категории есть файлы и для каждой категории я хочу вывести...

Конструкция left join join on on
Привет, что-то затруднился. Наткнулся на такой запрос в пакете: select * from table1 left join...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru