powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
32 сообщений из 32, показаны все 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
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
    #38387544
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan Durakruff3dпри поиске статического значения типа "p.kod = '1234567890'" ищет секунд 10.
пользуюсь dbForge Studio for MySQL, создает промежуточную таблицу при выборке.
код преобразуй в integerПоле VARCHAR-ное, чем тут поможет integer?
...
Рейтинг: 0 / 0
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
    #38387581
ruff3d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кто работал с такими объемными таблицами? Как ускорить выборку (пресечение) данных таблиц?
...
Рейтинг: 0 / 0
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
    #38387674
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ruff3dКак ускорить выборку (пресечение) данных таблиц?Для начала я бы разобрался с данными. Зачем такие длинные поля? Почему они типа VARCHAR? Нельзя ли их преобразовать в INT?
Затем попробовал бы построить индекс без префиксов.
...
Рейтинг: 0 / 0
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
    #38387685
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftIvan Durakпропущено...

код преобразуй в integerПоле VARCHAR-ное, чем тут поможет integer?
вот ПОЛЕ и преобразуй. Видно же что там целочисленные данные.
...
Рейтинг: 0 / 0
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
    #38387746
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan Durakmiksoftпропущено...
Поле VARCHAR-ное, чем тут поможет integer?
вот ПОЛЕ и преобразуй. Видно же что там целочисленные данные.Увы, видно только топикстартеру. Может, там не все значения целочисленные...
...
Рейтинг: 0 / 0
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
    #38387825
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ruff3d,

Возникает вопрос сразу в необходимости такого запроса. Зачем нужен список всех людей с их городами?
Зачем нужен distinct в запросе?
Он будет очень дорог при таких объемах, а kod и fio, похоже, уникальные ключи, и если связь с адресом не 1 к N, а N к 1, то distinct не нужен.

А по остальному, если убрать distinct, то для него нужны только индекс по полям связки, kod.

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

Возникает вопрос сразу в необходимости такого запроса. Зачем нужен список всех людей с их городами?
Зачем нужен distinct в запросе?
Он будет очень дорог при таких объемах, а kod и fio, похоже, уникальные ключи, и если связь с адресом не 1 к N, а N к 1, то distinct не нужен.

А по остальному, если убрать distinct, то для него нужны только индекс по полям связки, kod.

Идеально было бы использовать тут merge join, но mySQL его кажется ещё не поддерживает.

мне нужно вывести только тех людей, чьи кода есть в базе adr, в которой дублируются строки (kod, adress).
...
Рейтинг: 0 / 0
32 сообщений из 32, показаны все 2 страниц
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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