Команда REQL выполняется слишком долго

У меня есть таблица в базе данных в rethinkdb с 5,8 миллионами записей, образец которой представлен ниже:

{
"release": {
    "genres": {
        "genre": "Electronic"
    },
    "identifiers": {
        "identifier": [
            {
                "description": "A-Side",
                "value": "MPO SK 032 A1 G PHRUPMASTERGENERAL T27 LONDON",
                "type": "Matrix / Runout"
            },
            {
                "description": "B-Side",
                "value": "MPO SK 032 B1",
                "type": "Matrix / Runout"
            },
            {
                "description": "C-Side",
                "value": "MPO SK 032 C1",
                "type": "Matrix / Runout"
            },
            {
                "description": "D-Side",
                "value": "MPO SK 032 D1",
                "type": "Matrix / Runout"
            }
        ]
    },
    "status": "Accepted",
    "videos": {
        "video": [
            {
                "title": "The Persuader (Jesper Dahlbäck) - Östermalm",
                "duration": 290,
                "description": "The Persuader (Jesper Dahlbäck) - Östermalm",
                "src": "http://www.youtube.com/watch?v=AHuQWcylaU4",
                "embed": true
            },
            {
                "title": "The Persuader - Vasastaden",
                "duration": 380,
                "description": "The Persuader - Vasastaden",
                "src": "http://www.youtube.com/watch?v=5rA8CTKKEP4",
                "embed": true
            },
            {
                "title": "The Persuader-Stockholm-Sodermalm",
                "duration": 335,
                "description": "The Persuader-Stockholm-Sodermalm",
                "src": "http://www.youtube.com/watch?v=QVdDhOnoR8k",
                "embed": true
            },
            {
                "title": "The Persuader - Norrmalm",
                "duration": 289,
                "description": "The Persuader - Norrmalm",
                "src": "http://www.youtube.com/watch?v=hy47qgyJeG0",
                "embed": true
            }
        ]
    },
    "labels": {
        "label": {
            "catno": "SK032",
            "name": "Svek"
        }
    },
    "companies": {
        "company": [
            {
                "id": 271046,
                "catno": "",
                "name": "The Globe Studios",
                "entity_type_name": "Recorded At",
                "resource_url": "http://api.discogs.com/labels/271046",
                "entity_type": 23
            },
            {
                "id": 56025,
                "catno": "",
                "name": "MPO",
                "entity_type_name": "Pressed By",
                "resource_url": "http://api.discogs.com/labels/56025",
                "entity_type": 17
            }
        ]
    },
    "styles": {
        "style": "Deep House"
    },
    "formats": {
        "format": {
            "text": "",
            "name": "Vinyl",
            "qty": 2,
            "descriptions": {
                "description": [
                    "12\"",
                    "33 ⅓ RPM"
                ]
            }
        }
    },
    "country": "Sweden",
    "id": 1,
    "released": "1999-03-00",
    "artists": {
        "artist": {
            "id": 1,
            "anv": "",
            "name": "Persuader, The",
            "role": "",
            "tracks": "",
            "join": ""
        }
    },
    "title": "Stockholm",
    "master_id": 5427,
    "tracklist": {
        "track": [
            {
                "position": "A",
                "duration": "4:45",
                "title": "Östermalm"
            },
            {
                "position": "B1",
                "duration": "6:11",
                "title": "Vasastaden"
            },
            {
                "position": "B2",
                "duration": "2:49",
                "title": "Kungsholmen"
            },
            {
                "position": "C1",
                "duration": "5:38",
                "title": "Södermalm"
            },
            {
                "position": "C2",
                "duration": "4:52",
                "title": "Norrmalm"
            },
            {
                "position": "D",
                "duration": "5:16",
                "title": "Gamla Stan"
            }
        ]
    },
    "data_quality": "Complete and Correct",
    "extraartists": {
        "artist": {
            "id": 239,
            "anv": "",
            "name": "Jesper Dahlbäck",
            "role": "Music By [All Tracks By]",
            "tracks": "",
            "join": ""
        }
    },
    "notes": "The song titles are the names of Stockholm's districts."
}}

Я пытаюсь получить названия релизов, где имя исполнителя "Убеждающий, The"

Я использовал следующую команду:

r.db("discogs").table("releases").getField("release").filter(r.row("artists").getField("artist").getField("name").eq("Persuader, The")).getField("title")

Это занимает слишком много времени. Однако он быстро работает с небольшими базами данных. Как ускорить?


person Community    schedule 05.06.2015    source источник


Ответы (1)


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

Вы можете создать индекс для вложенного свойства имени исполнителя с помощью команды indexCreate:

r
  .db("discogs")
  .table("releases")
  .indexCreate('artistName', r.row('release')('artists')('artist')('name'));

После этого вы можете просто получить все строки с именами конкретных исполнителей с помощью команды getAll.

r
  .db("discogs")
  .table("releases")
  .getAll("Persuader, The", { index: 'artistName' });

Это не только чище, но и намного быстрее.

person Jorge Silva    schedule 05.06.2015
comment
Я получаю следующую ошибку :( RqlRuntimeError: Доступ к индексу artistName в таблице discogs.releases был осуществлен до того, как его построение было завершено в: r.db(discogs).table(releases).getAll(Persuader, The, {index: artistName}) ^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - person ; 06.06.2015
comment
Я пробовал indexWait(). Но это занимает слишком много времени. Также как мне использовать их несколько столбцов? - person ; 06.06.2015
comment
Вам нужно создать индекс только один раз. Когда вы создаете индекс, он должен индексировать каждый отдельный документ, так что да, это займет некоторое время. После того, как вы создали индекс, вам не нужно создавать его снова... - person Jorge Silva; 06.06.2015
comment
Если вы хотите создать индекс для нескольких столбцов, вы можете использовать функцию индекса (см. здесь: rethinkdb. com/api/javascript/index_create) - person Jorge Silva; 06.06.2015