|
|
|
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
|
|||
|---|---|---|---|
|
#18+
Доброго дня! Стоит задача выбрать общие значения в 2-х таблицах. С SQL запросом вроде-бы все понятно. Но вот время выборки выглядит пугающе... Я понимаю что 60 млн записей не обрабатываются за 5 минут, но я не знаю как ускорить выборку. Использовал индексирование ключевых полей, но безрезультатно. запрос такого типа Код: sql 1. 2. 3. 4. 5. 6. 7. 8. таблица people - 60 000 000 записей, adr - 20 000 индексировал kod, fio, dr (people) и adr.kod Подскажите, что может быть решением данной проблемы. Тип таблиц - InnoDB Сервер Xeon (4 ядра) RAM 4GB (настройки mysql оптимизировал для InnoDB) З.Ы. выборка проводилась 2 дня, на 3-й я психанул)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2013, 11:22:17 |
|
||
|
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
|
|||
|---|---|---|---|
|
#18+
Опишите задачу более полно. Из каких таблиц выбираются поля? Желательно это явно указать в запросе. Зачем в запросе DISTINCT? Покажите DDL таблиц и имеющихся индексов и план запроса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2013, 11:27:12 |
|
||
|
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
|
|||
|---|---|---|---|
|
#18+
ruff3d З.Ы. выборка проводилась 2 дня, на 3-й я психанул)) не психуй. Давай таблицы. и индексы. А для начала выкинь дистинкт - уже на порядок шустрее будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2013, 11:56:38 |
|
||
|
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
|
|||
|---|---|---|---|
|
#18+
Чувствую погрешность в длине полей (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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2013, 12:04:23 |
|
||
|
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
|
|||
|---|---|---|---|
|
#18+
ruff3dзапрос такого типа Код: sql 1. 2. 3. 4. 5. 6. 7. 8. И что, мускль не плюнул в вас ошибкой 'ambiguous column name "kod"'? Ну и explain запроса неплохо было бы увидеть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2013, 12:36:17 |
|
||
|
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
|
|||
|---|---|---|---|
|
#18+
ruff3d Код: sql 1. 2. 3. а вот это (равно как и town varchar(255)) вообще адъ (и израиль) курить "нормальная форма", срочно! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2013, 12:37:42 |
|
||
|
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
|
|||
|---|---|---|---|
|
#18+
Ну и ещё - поскольку у вас индексируются только первые 10 символов, то выполнению запроса этот индекс, наверное, слабо поможет - мусклю всё равно придётся (каждый раз, когда код хотя бы с одной стороны длиннее 10 символов, а может, и вообще всегда) лезть в базу, чтобы сравнить полные значения полей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2013, 12:52:12 |
|
||
|
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
|
|||
|---|---|---|---|
|
#18+
базу просто переконвертировал с другой бд, поэтому ничего не менял.... вот с длиной поля ток погарячился. индексы как только не ставил и на 20 символов (индексировало 2 дня). есть еще какие-нибудь замечания? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2013, 14:47:08 |
|
||
|
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
|
|||
|---|---|---|---|
|
#18+
привести размеры полей в к длине данных. перейти на CHAR(N) вместо VARCHAR(N) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2013, 14:53:38 |
|
||
|
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
|
|||
|---|---|---|---|
|
#18+
ScareCrow, думаете ускорит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2013, 15:08:22 |
|
||
|
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
|
|||
|---|---|---|---|
|
#18+
ScareCrow, думаете ускорит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2013, 15:09:55 |
|
||
|
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
|
|||
|---|---|---|---|
|
#18+
и что по поводу дефолтных значений NULL ??? это нормально или без них все-таки быстрее?)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2013, 15:25:13 |
|
||
|
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
|
|||
|---|---|---|---|
|
#18+
еще можно varchar(255) c помощью hash преобразовать в числа. Так как различных значений у вас не больше 60 миллионов 10-значные числа это прекрасно покроют. тогда и индексирование будет иметь смысл. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2013, 15:38:20 |
|
||
|
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
|
|||
|---|---|---|---|
|
#18+
ruff3dДоброго дня! Стоит задача выбрать общие значения в 2-х таблицах. С SQL запросом вроде-бы все понятно. Но вот время выборки выглядит пугающе... Я понимаю что 60 млн записей не обрабатываются за 5 минут, но я не знаю как ускорить выборку. Использовал индексирование ключевых полей, но безрезультатно. запрос такого типа Код: sql 1. 2. 3. 4. 5. 6. 7. 8. таблица 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2013, 18:29:08 |
|
||
|
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2013, 18:51:38 |
|
||
|
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
|
|||
|---|---|---|---|
|
#18+
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К адресов (лучше по основному ключу от...до......от...до...от...до). Опятьже, как вы будете использовать эти данные? может их в промежуточную таблицу загнать или сразу агрегировать для отчетов...или что? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2013, 19:09:13 |
|
||
|
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
|
|||
|---|---|---|---|
|
#18+
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 файл. может есть еще какие-нить размышления? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2013, 20:39:26 |
|
||
|
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
|
|||
|---|---|---|---|
|
#18+
ruff3dДело в том что там и так должно получится не более 20K строк.т.е. к каждому адресу привязано не более одного человека? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2013, 21:05:49 |
|
||
|
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
|
|||
|---|---|---|---|
|
#18+
ruff3d, я бы сделал так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. потом 100, потом 5К... просто посмотреть скорости. кроме того, как вы грузите в ексел? сразу из какгото ГУЯ? может проще будет создать промежуточную таблицу? а потом выгружать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2013, 22:45:34 |
|
||
|
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
|
|||
|---|---|---|---|
|
#18+
tanglirruff3dДело в том что там и так должно получится не более 20K строк.т.е. к каждому адресу привязано не более одного человека? там не нормальная форма, просто нашел таблицу с адресами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2013, 09:20:41 |
|
||
|
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
|
|||
|---|---|---|---|
|
#18+
javajdbcruff3d, я бы сделал так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. потом 100, потом 5К... просто посмотреть скорости. кроме того, как вы грузите в ексел? сразу из какгото ГУЯ? может проще будет создать промежуточную таблицу? а потом выгружать? при поиске статического значения типа "p.kod = '1234567890'" ищет секунд 10. пользуюсь dbForge Studio for MySQL, создает промежуточную таблицу при выборке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2013, 09:27:10 |
|
||
|
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
|
|||
|---|---|---|---|
|
#18+
ruff3djavajdbcruff3d, я бы сделал так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. потом 100, потом 5К... просто посмотреть скорости. кроме того, как вы грузите в ексел? сразу из какгото ГУЯ? может проще будет создать промежуточную таблицу? а потом выгружать? при поиске статического значения типа "p.kod = '1234567890'" ищет секунд 10. пользуюсь dbForge Studio for MySQL, создает промежуточную таблицу при выборке. хотя нет, это не представление VIEW, а просто вывод в таблицу)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2013, 09:56:44 |
|
||
|
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
|
|||
|---|---|---|---|
|
#18+
ruff3dпри поиске статического значения типа "p.kod = '1234567890'" ищет секунд 10.у вас индексы в память не лезут, других объяснений я не вижу... PS. задачка: умножить 10 секунд на 60 миллионов записей и прикинуть время выполнения запроса :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2013, 10:25:42 |
|
||
|
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
|
|||
|---|---|---|---|
|
#18+
ruff3dпри поиске статического значения типа "p.kod = '1234567890'" ищет секунд 10. пользуюсь dbForge Studio for MySQL, создает промежуточную таблицу при выборке. код преобразуй в integer ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2013, 10:38:29 |
|
||
|
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
|
|||
|---|---|---|---|
|
#18+
tanglirruff3dпри поиске статического значения типа "p.kod = '1234567890'" ищет секунд 10.у вас индексы в память не лезут, других объяснений я не вижу...Ну почему же? Может '1234567890' настолько неуникальное значение, что за остатком строки очень много раз приходится лазить в таблицу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2013, 10:49:40 |
|
||
|
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
|
|||
|---|---|---|---|
|
#18+
Ivan Durakruff3dпри поиске статического значения типа "p.kod = '1234567890'" ищет секунд 10. пользуюсь dbForge Studio for MySQL, создает промежуточную таблицу при выборке. код преобразуй в integerПоле VARCHAR-ное, чем тут поможет integer? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2013, 10:50:09 |
|
||
|
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
|
|||
|---|---|---|---|
|
#18+
кто работал с такими объемными таблицами? Как ускорить выборку (пресечение) данных таблиц? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2013, 11:16:27 |
|
||
|
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
|
|||
|---|---|---|---|
|
#18+
ruff3dКак ускорить выборку (пресечение) данных таблиц?Для начала я бы разобрался с данными. Зачем такие длинные поля? Почему они типа VARCHAR? Нельзя ли их преобразовать в INT? Затем попробовал бы построить индекс без префиксов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2013, 12:10:27 |
|
||
|
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
|
|||
|---|---|---|---|
|
#18+
miksoftIvan Durakпропущено... код преобразуй в integerПоле VARCHAR-ное, чем тут поможет integer? вот ПОЛЕ и преобразуй. Видно же что там целочисленные данные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2013, 12:17:24 |
|
||
|
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
|
|||
|---|---|---|---|
|
#18+
Ivan Durakmiksoftпропущено... Поле VARCHAR-ное, чем тут поможет integer? вот ПОЛЕ и преобразуй. Видно же что там целочисленные данные.Увы, видно только топикстартеру. Может, там не все значения целочисленные... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2013, 12:43:06 |
|
||
|
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
|
|||
|---|---|---|---|
|
#18+
ruff3d, Возникает вопрос сразу в необходимости такого запроса. Зачем нужен список всех людей с их городами? Зачем нужен distinct в запросе? Он будет очень дорог при таких объемах, а kod и fio, похоже, уникальные ключи, и если связь с адресом не 1 к N, а N к 1, то distinct не нужен. А по остальному, если убрать distinct, то для него нужны только индекс по полям связки, kod. Идеально было бы использовать тут merge join, но mySQL его кажется ещё не поддерживает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2013, 13:23:09 |
|
||
|
Выборка пересечения между 2-х таблиц (в одной 60 млн записей, во второй 20 тыс. записей)
|
|||
|---|---|---|---|
|
#18+
MasterZivruff3d, Возникает вопрос сразу в необходимости такого запроса. Зачем нужен список всех людей с их городами? Зачем нужен distinct в запросе? Он будет очень дорог при таких объемах, а kod и fio, похоже, уникальные ключи, и если связь с адресом не 1 к N, а N к 1, то distinct не нужен. А по остальному, если убрать distinct, то для него нужны только индекс по полям связки, kod. Идеально было бы использовать тут merge join, но mySQL его кажется ещё не поддерживает. мне нужно вывести только тех людей, чьи кода есть в базе adr, в которой дублируются строки (kod, adress). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2013, 17:14:56 |
|
||
|
|

start [/forum/topic.php?all=1&fid=47&tid=1836108]: |
0ms |
get settings: |
8ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
24ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
82ms |
get tp. blocked users: |
1ms |
| others: | 194ms |
| total: | 345ms |

| 0 / 0 |
