|
|
|
Выборка пересечения между 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 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38386783&tid=1836108]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
27ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
| others: | 208ms |
| total: | 317ms |

| 0 / 0 |
