Couchbase N1QL — это SQL-подобный язык для данных JSON. Для эффективного извлечения и обработки данных JSON нам нужны соответствующие индексы. Правила создания этих индексов можно прочитать здесь . Но это включает в себя слишком много читать, поэтому теперь мы имеем Advisor индекс службы , который принимает запрос и выдает рекомендации в индекс , который отвечал бы ожиданиям двигателя запроса Couchbase — все без загрузки последнего сервера Couchbase.
Этот сервис предоставит рекомендации по индексам, чтобы помочь администраторам баз данных, разработчикам и архитекторам оптимизировать производительность запросов и соответствовать соглашениям об уровне обслуживания.
Index Advisor выпущен как часть Couchbase Server 6.5. Если вы скачали эту версию, то у вас есть все (и даже больше), чем предоставляет этот сервис. Эта услуга ежемесячно обновляется. До сих пор, после первоначального выпуска сервиса в январе, в феврале и марте проводились обновления для дефектов, обнаруженных QE и клиентами, использующими сервис.
Когда вы должны использовать эту услугу
Если ты:
- Хотите избежать чтения правил создания индексов , их понимания или реализации, чтобы найти соответствующие индексы для вашего запроса / запросов / рабочей нагрузки.
- Не хотите загружать последнюю версию сервера Couchbase 6.5.
- Используете старую версию Couchbase и вам нужна помощь в создании правильных индексов для ваших запросов.
- Хотите генерировать рекомендации для индексов без создания корзины или загрузки схемы или данных.
Вам также могут понравиться:
N1QL и ПОИСК: как использовать полнотекстовый индекс (FTS) Couchbase в N1QL
Фон
N1QL — это SQL для данных и метаданных JSON. Каждый запрос, написанный на N1QL, имеет план запроса, подготовленный механизмом запросов N1QL. Производительность и эффективность запроса зависят от его плана. Создание правильных индексов для данных помогает в выборе тех индексов, которые могут извлечь набор результатов наиболее эффективным способом. Несмотря на то, что сам документ JSON не имеет схемы, индекс должен иметь схему.
Например, индекс ix1 (field1, field2) отличается от индекса ix2 (field2, field1).
Таким образом, не только поля, которые мы выбираем для индекса, важны, порядок, в котором они присутствуют в индексе, также важен для индексов GSI.
Жизнь Запроса:
В зависимости от того, насколько хорош шаг 4, мы можем минимизировать / полностью пропустить шаги 5 и 6 и тем самым повысить производительность запроса. Поэтому выбор полей в индексе является очень важной частью. Чтобы помочь с этим, мы выпускаем советник по индексам.
Индекс Советник: Сервис
С помощью Index Advisor вы можете
- Предоставьте запрос или несколько запросов даже с сервера старше 6.5, и служба порекомендует индексы, которые вы должны иметь / создать, чтобы добиться максимальной производительности.
- Поскольку у нас нет ваших данных или схемы, мы не можем увидеть, есть ли у вас эти индексы. Вскоре мы улучшим этот интерфейс, чтобы принимать данные / статистику / схему / выводить операционные / текущие индексы — или что-либо еще, что вы можете предоставить нам, чтобы дать лучшие рекомендации.
Как только вы дадите нам запрос с директивой ADVISE, инструмент даст рекомендации для минимального индекса и индекса покрытия.
- Индексы . В этом разделе перечислены рекомендуемые индексы на основе предикатов в предложении WHERE / ON, а также соответствующее правило рекомендации, которому следует каждый индекс.
- Покрывающие индексы : в этом разделе перечислены закрывающие индексы, применимые к входному запросу, то есть индекс, который включает все поля, на которые есть ссылки в запросе, чтобы избежать дополнительного перехода к службе данных.
Вот внешний вид инструмента:
Примеры:
1.
Джава
xxxxxxxxxx
1
ADVISE SELECT fname, age, age/7 AS age_dog_years FROM trial WHERE fname = 'Sara'
2.
Джава
xxxxxxxxxx
1
ADVISE SELECT (DISTINCT purchases.customerId)FROM purchases
2
WHERE purchases.purchasedAt BETWEEN "2014-03-01" AND "2014-03-31"
JSON
xxxxxxxxxx
1
{
2
"results": [
3
{
4
"#operator": "Advise",
5
"advice": {
6
"#operator": "IndexAdvice",
7
"adviseinfo": [
8
{
9
"recommended_indexes": {
10
"indexes": [
11
{
12
"index_statement": "CREATE INDEX adv_purchasedAt ON `purchases`(`purchasedAt`)",
13
"keyspace_alias": "purchases",
14
"recommending_rule": "Index keys follow order of predicate types: 4. not less than/between/not greater than."
15
}
16
]
17
}
18
}
19
]
20
},
21
"query": "SELECT (DISTINCT purchases.customerId) \nFROM purchases\nWHERE purchases.purchasedAt BETWEEN \"2014-03-01\" AND \"2014-03-31\""
22
}
23
]
24
}
3.
Джава
xxxxxxxxxx
1
ADVISE SELECT DISTINCT airline.name,airport.name AS airport,route.distance
2
FROM `travel-sample` airport INNER JOIN `travel-sample` route ON airport.faa = route.sourceairport
4
AND route.type = "route" INNER JOIN `travel-sample` airline ON route.airline = airline.iata AND airline.type = "airline"
JSON
xxxxxxxxxx
1
{
2
"results": [
3
{
4
"#operator": "Advise",
5
"advice": {
6
"#operator": "IndexAdvice",
7
"adviseinfo": [
8
{
9
"recommended_indexes": {
10
"covering_indexes": [
11
{
12
"index_statement": "CREATE INDEX adv_type_sourceairport_airline_distance ON `travel-sample`(`type`,`sourceairport`,`airline`,`distance`)",
13
"keyspace_alias": "travel-sample_route"
14
},
15
{
16
"index_statement": "CREATE INDEX adv_type_iata_name ON `travel-sample`(`type`,`iata`,`name`)",
17
"keyspace_alias": "travel-sample_airline"
18
}
19
],
20
"indexes": [
21
{
22
"index_statement": "CREATE INDEX adv_type_sourceairport ON `travel-sample`(`type`,`sourceairport`)",
23
"keyspace_alias": "travel-sample_route",
24
"recommending_rule": "Index keys follow order of predicate types: 2. equality/null/missing, 10. non-static join predicate."
25
},
26
{
27
"index_statement": "CREATE INDEX adv_type_iata ON `travel-sample`(`type`,`iata`)",
28
"keyspace_alias": "travel-sample_airline",
29
"recommending_rule": "Index keys follow order of predicate types: 2. equality/null/missing, 10. non-static join predicate."
30
}
31
]
32
}
33
}
34
]
35
},
36
"query": "SELECT DISTINCT airline.name,airport.name AS airport,route.distance FROM `travel-sample` airport INNER JOIN `travel-sample` route ON airport.faa = route.sourceairport AND route.type = \"route\"\nINNER JOIN `travel-sample` airline ON route.airline = airline.iata AND airline.type = \"airline\"\nWHERE airport.type = \"airport\" AND airport.city = \"San Jose\";"
37
}
38
]
39
}
4.
Джава
xxxxxxxxxx
1
SELECT ADVISOR(["SELECT * FROM `travel-sample` WHERE type = 'hotel' AND city = 'Paris'",
2
"SELECT * FROM `travel-sample` h JOIN `travel-sample` a ON a.city = h.city WHERE h.type = 'hotel' AND a.type = 'airport'"])
Результат
JSON
xxxxxxxxxx
1
{
2
"results": [
3
{
4
"$1": {
5
"recommended_indexes": [
6
{
7
"index": "CREATE INDEX adv_type_city ON `travel-sample`(`type`,`city`)",
8
"statements": [
9
{
10
"run_count": 1,
11
"statement": "SELECT * FROM `travel-sample` WHERE type = 'hotel' AND city = 'Paris'"
12
},
13
{
14
"run_count": 1,
15
"statement": "SELECT * FROM `travel-sample` h JOIN `travel-sample` a ON a.city = h.city WHERE h.type = 'hotel' AND a.type = 'airport'"
16
}
17
]
18
}
19
]
20
}
21
}
22
]
23
}
Что остается сделать
1. Улучшить интерфейс для этого инструмента. Предоставьте индексные рекомендации в тексте для облегчения вырезания и вставки. В настоящее время он обеспечивает вывод в формате JSON.
2. Принимайте ароматы, чтобы мы могли генерировать частичные рекомендации по индексам.
3. Предоставьте пользователю возможность ввести схему, существующие индексы, сделать вывод и, возможно, даже проверить данные.
Мы будем рады услышать от вас, как вам понравился инструмент, какие дополнительные функции вы хотели бы видеть. Пожалуйста, поделитесь своим мнением через комментарии.
Резюме
Советник по индексам (инструкция ADVISE) предоставляет рекомендации по индексам для одного запроса. Он сообщает обычный индекс, индекс массива и покрывающий индекс и предоставляет информацию о соответствующем правиле рекомендации, которому следует каждый ключ индекса.
Советник по индексам (оператор ADVISOR) предоставляет рекомендации по индексам для нескольких запросов. Он рекомендует использовать как можно меньше индексов, подходящих для всех запросов в массиве.
Дальнейшее чтение
Couchbase N1QL: запрашивать или анализировать?
Индексный советник для Couchbase N1QL - февраль, обновление
Индексный советник для Couchbase N1QL - мартовское обновление