powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
25 сообщений из 32, страница 1 из 2
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
    #38386298
ruff3d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго дня!
Стоит задача выбрать общие значения в 2-х таблицах. С SQL запросом вроде-бы все понятно. Но вот время выборки выглядит пугающе... Я понимаю что 60 млн записей не обрабатываются за 5 минут, но я не знаю как ускорить выборку. Использовал индексирование ключевых полей, но безрезультатно.

запрос такого типа
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT
  DISTINCT
    kod,
    fio,
    dr,
    town 
FROM people p
   JOIN adr a ON a.kod=p.kod ;



таблица people - 60 000 000 записей, adr - 20 000


индексировал kod, fio, dr (people) и adr.kod

Подскажите, что может быть решением данной проблемы.
Тип таблиц - InnoDB
Сервер Xeon (4 ядра) RAM 4GB (настройки mysql оптимизировал для InnoDB)

З.Ы. выборка проводилась 2 дня, на 3-й я психанул))
...
Рейтинг: 0 / 0
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
    #38386309
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опишите задачу более полно.
Из каких таблиц выбираются поля? Желательно это явно указать в запросе.
Зачем в запросе DISTINCT?
Покажите DDL таблиц и имеющихся индексов и план запроса.
...
Рейтинг: 0 / 0
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
    #38386362
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ruff3d З.Ы. выборка проводилась 2 дня, на 3-й я психанул))
не психуй. Давай таблицы. и индексы.
А для начала выкинь дистинкт - уже на порядок шустрее будет.
...
Рейтинг: 0 / 0
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
    #38386382
ruff3d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чувствую погрешность в длине полей (255)))) Но не думаю что проблема только в этом.
Код: 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.
CREATE TABLE people (
  kod varchar(255) DEFAULT NULL,
  fio(255) DEFAULT NULL,
  dr date DEFAULT NULL,
  town varchar(255) DEFAULT NULL,
  INDEX IDX_people (kod (10), fio (20), dr)
)
ENGINE = INNODB
AVG_ROW_LENGTH = 350
CHARACTER SET utf8
COLLATE utf8_general_ci;


CREATE TABLE adr ( 
  kod varchar(255) DEFAULT NULL,
  ul varchar(255) DEFAULT NULL,
  d varchar(255) DEFAULT NULL,
  kv varchar(255) DEFAULT NULL,
  INDEX IDX_adr (kod (10), ul (20), d (3), kv(3))
)
ENGINE = INNODB
AVG_ROW_LENGTH = 197
CHARACTER SET utf8
COLLATE utf8_general_ci;
...
Рейтинг: 0 / 0
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
    #38386465
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ruff3dзапрос такого типа
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT
  DISTINCT
    kod,
    fio,
    dr,
    town 
FROM people p
   JOIN adr a ON a.kod=p.kod ;

И что, мускль не плюнул в вас ошибкой 'ambiguous column name "kod"'?
Ну и explain запроса неплохо было бы увидеть.
...
Рейтинг: 0 / 0
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
    #38386467
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ruff3d
Код: sql
1.
2.
3.
  ul varchar(255) DEFAULT NULL,
  d varchar(255) DEFAULT NULL,
  kv varchar(255) DEFAULT NULL,

а вот это (равно как и town varchar(255)) вообще адъ (и израиль)
курить "нормальная форма", срочно!
...
Рейтинг: 0 / 0
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
    #38386494
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и ещё - поскольку у вас индексируются только первые 10 символов, то выполнению запроса этот индекс, наверное, слабо поможет - мусклю всё равно придётся (каждый раз, когда код хотя бы с одной стороны длиннее 10 символов, а может, и вообще всегда) лезть в базу, чтобы сравнить полные значения полей.
...
Рейтинг: 0 / 0
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
    #38386712
ruff3d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
базу просто переконвертировал с другой бд, поэтому ничего не менял.... вот с длиной поля ток погарячился.
индексы как только не ставил и на 20 символов (индексировало 2 дня).
есть еще какие-нибудь замечания?
...
Рейтинг: 0 / 0
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
    #38386726
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
привести размеры полей в к длине данных.
перейти на CHAR(N) вместо VARCHAR(N)
...
Рейтинг: 0 / 0
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
    #38386745
ruff3d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrow,
думаете ускорит?
...
Рейтинг: 0 / 0
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
    #38386747
ruff3d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrow,
думаете ускорит?
...
Рейтинг: 0 / 0
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
    #38386783
ruff3d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и что по поводу дефолтных значений NULL ??? это нормально или без них все-таки быстрее?))
...
Рейтинг: 0 / 0
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
    #38386809
transpose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще можно varchar(255) c помощью hash преобразовать в числа. Так как различных значений у вас не больше 60 миллионов 10-значные числа это прекрасно покроют. тогда и индексирование будет иметь смысл.
...
Рейтинг: 0 / 0
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
    #38387115
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ruff3dДоброго дня!
Стоит задача выбрать общие значения в 2-х таблицах. С SQL запросом вроде-бы все понятно. Но вот время выборки выглядит пугающе... Я понимаю что 60 млн записей не обрабатываются за 5 минут, но я не знаю как ускорить выборку. Использовал индексирование ключевых полей, но безрезультатно.

запрос такого типа
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT
  DISTINCT
    kod,
    fio,
    dr,
    town 
FROM people p
   JOIN adr a ON a.kod=p.kod ;



таблица people - 60 000 000 записей, adr - 20 000


индексировал kod, fio, dr (people) и adr.kod

Подскажите, что может быть решением данной проблемы.
Тип таблиц - InnoDB
Сервер Xeon (4 ядра) RAM 4GB (настройки mysql оптимизировал для InnoDB)

З.Ы. выборка проводилась 2 дня, на 3-й я психанул))

1. как и зачем вы будете использовать результат?

2. приводите точный запрос, а не ту подделку которыю вы показали.

3. Вас просили показать EXPLAIN.
...
Рейтинг: 0 / 0
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
    #38387137
ruff3d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Explain

id | select_type | table | possible_keys | key | key_len | ref | rows | Extra
1 SIMPLE adr ALL IDX_kulik (null) (null) (null) 518
1 SIMPLE people ref IDX_people IDX_people 33 adr.kod 1 Using where
...
Рейтинг: 0 / 0
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
    #38387157
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ruff3dExplain

id | select_type | table | possible_keys | key | key_len | ref | rows | Extra
1 SIMPLE adr ALL IDX_kulik (null) (null) (null) 518
1 SIMPLE people ref IDX_people IDX_people 33 adr.kod 1 Using where

ну експлейн -- вроде нормальный, ничего военного.
60М...20М записей -- ну наверно просто много и долго.
Когда промежуточные результаты не поменшаются в памят'
они вываливают на диск и все становится в 100 раз скучнее.

Самое простое -- нарежте задачу на мелкие кусочки,
скажем в процедуре по 10К людей или по 10К адресов
(лучше по основному ключу от...до......от...до...от...до).

Опятьже, как вы будете использовать эти данные?
может их в промежуточную таблицу загнать или
сразу агрегировать для отчетов...или что?
...
Рейтинг: 0 / 0
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
    #38387215
ruff3d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javajdbcruff3dExplain

id | select_type | table | possible_keys | key | key_len | ref | rows | Extra
1 SIMPLE adr ALL IDX_adr (null) (null) (null) 518
1 SIMPLE people ref IDX_people IDX_people 33 adr.kod 1 Using where

ну експлейн -- вроде нормальный, ничего военного.
60М...20М записей -- ну наверно просто много и долго.
Когда промежуточные результаты не поменшаются в памят'
они вываливают на диск и все становится в 100 раз скучнее.

Самое простое -- нарежте задачу на мелкие кусочки,
скажем в процедуре по 10К людей или по 10К адресов
(лучше по основному ключу от...до......от...до...от...до).

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

Дело в том что там и так должно получится не более 20K строк.
Выбранные данные я экспортирую в xls файл.
может есть еще какие-нить размышления?
...
Рейтинг: 0 / 0
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
    #38387223
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ruff3dДело в том что там и так должно получится не более 20K строк.т.е. к каждому адресу привязано не более одного человека?
...
Рейтинг: 0 / 0
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
    #38387261
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ruff3d,

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT
    kod,
    fio,
    dr,
    town 
FROM
(select * from address limit 1 ) a
   STRAIGHT JOIN people  p ON a.kod=p.kod ;



потом 100, потом 5К... просто посмотреть скорости.
кроме того, как вы грузите в ексел?
сразу из какгото ГУЯ?
может проще будет создать промежуточную таблицу?
а потом выгружать?
...
Рейтинг: 0 / 0
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
    #38387425
ruff3d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglirruff3dДело в том что там и так должно получится не более 20K строк.т.е. к каждому адресу привязано не более одного человека?

там не нормальная форма, просто нашел таблицу с адресами.
...
Рейтинг: 0 / 0
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
    #38387430
ruff3d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javajdbcruff3d,

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT
    kod,
    fio,
    dr,
    town 
FROM
(select * from address limit 1 ) a
   STRAIGHT JOIN people  p ON a.kod=p.kod ;



потом 100, потом 5К... просто посмотреть скорости.
кроме того, как вы грузите в ексел?
сразу из какгото ГУЯ?
может проще будет создать промежуточную таблицу?
а потом выгружать?

при поиске статического значения типа "p.kod = '1234567890'" ищет секунд 10.
пользуюсь dbForge Studio for MySQL, создает промежуточную таблицу при выборке.
...
Рейтинг: 0 / 0
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
    #38387461
ruff3d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ruff3djavajdbcruff3d,

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT
    kod,
    fio,
    dr,
    town 
FROM
(select * from address limit 1 ) a
   STRAIGHT JOIN people  p ON a.kod=p.kod ;



потом 100, потом 5К... просто посмотреть скорости.
кроме того, как вы грузите в ексел?
сразу из какгото ГУЯ?
может проще будет создать промежуточную таблицу?
а потом выгружать?

при поиске статического значения типа "p.kod = '1234567890'" ищет секунд 10.
пользуюсь dbForge Studio for MySQL, создает промежуточную таблицу при выборке.

хотя нет, это не представление VIEW, а просто вывод в таблицу))
...
Рейтинг: 0 / 0
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
    #38387504
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ruff3dпри поиске статического значения типа "p.kod = '1234567890'" ищет секунд 10.у вас индексы в память не лезут, других объяснений я не вижу...
PS. задачка: умножить 10 секунд на 60 миллионов записей и прикинуть время выполнения запроса :)
...
Рейтинг: 0 / 0
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
    #38387521
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ruff3dпри поиске статического значения типа "p.kod = '1234567890'" ищет секунд 10.
пользуюсь dbForge Studio for MySQL, создает промежуточную таблицу при выборке.
код преобразуй в integer
...
Рейтинг: 0 / 0
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
    #38387542
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglirruff3dпри поиске статического значения типа "p.kod = '1234567890'" ищет секунд 10.у вас индексы в память не лезут, других объяснений я не вижу...Ну почему же? Может '1234567890' настолько неуникальное значение, что за остатком строки очень много раз приходится лазить в таблицу.
...
Рейтинг: 0 / 0
25 сообщений из 32, страница 1 из 2
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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