Есть такая задача: внутренними ресурсами реализовать сбор статистики - показ изображений, клики по изображениям, и потом делать выборку изображений за заданный период с максимальным числом показов или кликов. Как я понял, примерно для таких задач и был задуман egine=columnar, но никак не соображу, как правильно это организовать. Как это сделать в обычной SQL-базе - это все понятно. Но раз уж все равно использую Мантикору для полнотекстового поиска в системе, то почему бы не использовать и для такой задачи? Но в доках только про то, есть colunnar-движок и columnar-атрибуты, а как их на практике задействовать - не пойму.
Если у вас индексы описаны в конфиге, то вот так:
index ... {
...
columnar_attrs = ...
}
Если вы создаёте индексы на лету, то так:
create table ... engine='columnar'
чтоб использовать columnar storage для всех возможных атрибутов или
create table <table name> (<attr name> int|float|... engine='columnar')
чтоб указать конкретные атрибуты, которые должны использовать columnar storage.
Например:
mysql> drop table if exists t; create table t(f text, a int engine='columnar', b int); desc t;
--------------
drop table if exists t
--------------
Query OK, 0 rows affected (0.00 sec)
--------------
create table t(f text, a int engine='columnar', b int)
--------------
Query OK, 0 rows affected (0.00 sec)
--------------
desc t
--------------
+-------+--------+----------------+
| Field | Type | Properties |
+-------+--------+----------------+
| id | bigint | |
| f | text | indexed stored |
| a | uint | columnar |
| b | uint | |
+-------+--------+----------------+
4 rows in set (0.00 sec)
Как создавать индексы и атрибуты - это понятно, непонятно, как дальше с этим работать. Если ближе к моей задаче, то для начала: как лучше - в общий индекс столбцовые атрибуты добавить?
create table t(img_id int, title text, view timestamp engine='columnar', click timestamp engine='columnar')
Или лучше отдельный индекс?
create table t1(img_id int, title text)
create table t2(img_id int, view timestamp, click timestamp) engine='columnar'
Или лучше отдельный индекс?
Это зависит от запросов, которые вы будете делать впоследствии. Если у вас будут запросы типа where match('@title ...') and view > ...
, то в один. Если будут запросы к таблицам по отдельности, то можно и в разные. JOIN’а в мантикоре нет, если что.
Нет, в одном запросе одновременно поиска по тексту и фильтрации по столбцовым атрибутам не будет, значит, наверное, лучше отдельным индексом. Но как дальше - все равно непонятно. Если б я делал это в классическом SQL, то было примерно бы так:
Добавляем каждый клик в базу
insert into(img_id, click) values(1,now())
А потом получаем выборку пяти самых кликабельних изображений за период d1-d2
select count(*) as cnt, img_id from t
where click>=d1 and click<=d2
group by img_id
order by count(*) desc
limit 5
А здесь как?
Примерно так же. Manticore же умеет и where и group by и order by и limit. Почитайте доку про фильтрацию и агрегацию.
Я читал, но полагал, что это все относится к row-wise, и ожидал, что для columnar-атрибутов это делается как-то иначе. Теперь дошло, спасибо!