SlideShare une entreprise Scribd logo
1  sur  51
Télécharger pour lire hors ligne
Sphinx 2013
Андрей Аксёнов
sphinxsearch.com
Что такое Sphinx
•
•
•
•
•
•

Сервер текстового поиска, http://sphinxsearch.com
Нет, не как Google/Yandex/Bing
Да, как Solr/Elastic/FAST/Verity/Autonomy/Yserver
Открытые исходники, бесплатный, GPL
300M+ запросов/сутки, 50+ TB коллекции
Кроме “просто поиска” умеет кучу всего
Про что доклад
•
•
•
•
•

Sphinx 2.1 == начали в 2012, выкатили в 2013
Sphinx 2.2 == начали в 2013, выкатим в 2013
~50 новых фич в 2.1
~40 новых фич в 2.2
Но фича, это может быть много…
Галопом по вершкам
• Линейка 2.1.x
• Встроенный адаптивный HA/LB
• Качество поиска
• Сигналы ранжирования, RU морфология, wordbreaker

• Начальная поддержка JSON
• Инструментирование (профайлинг на стероидах)
• Оптимизации!

• Бета в марте, релиз в октябре
Галопом по вершкам
• Линейка 2.2.x
• Манипуляции индексами, ALTER, ATTACH
• Качество поиска
• Сигналы + UDF v2, EN/DE/CN морфология, local_df

• Полная поддержка JSON
• Cпецфункции, GROUP <N> BY, табличные функции
• Оптимизации!

• Бета в октябре, релиз... принимаю ставки!
1. Про встроенный HA/LB
• Виды кластеров?
•
•
•
•

1 шард, N реплик
=> HAProxy
M шардов, 1 реплика
=> HAProxy (+бэкапы!)
M шардов, N реплик
=> HAProxy 
M шардов, N реплик, выбросы/гетерогено => HA/LB

• Читать про agent_mirror, ha_strategy, и т.д.
• Говорят, подробнее в следующем докладе
2. Про качество поиска
• Качество поиска это НЕ ранжирование!
2. Про качество поиска
• Качество поиска это НЕ ранжирование
• Токенизация, морфология, обработка при индексации
• Анализ и переписывание запросов при поиске
• Кворум, коррекция транслита/опечаток, расширения, и т.д.
• 1 поиск => 1…3+ запроса к серверу

• Ассессорские оценки качества
• Формула ранжирования

• Shameless plug: звоните, проконсультируем!!!
2. Про качество поиска: морфология
• stem_ar
• lemmatize_ru, _en, _de
• stem(BUSY) == BUSI, stem(BUSINESS) == BUSI
• lemma(BUSY) == BUSY, lemma(BUSINESS) == BUSINESS

• lemmatize_ru_all, _en_all, _de_all
• lemma(LEFT) == [LEAVE, LEFT]
• “He left us. Make a left turn.”
• “Поручик, это у вас что?!”
2. Про качество поиска: обработка
• $ echo lordofthering expertsexchange.com
| bin/wordbreaker --dict dict.txt split
lord of the rings
experts exchange
• regexp_filter
• wordforms = postmorph.txt:
~run > walk
# maps all of run, runs, running
2. Про качество поиска: ранжирование
• index_field_lengths, BM25A(), BM25F()
• global_idf, local_df, OPTION idf=plain, normalized, etc
• lccs, wlccs, exact_order, min_gaps, atc,
min_idf, max_idf, sum_idf
• PACKEDFACTORS()
• sphinx_get_XXX_factors()
2. Про качество поиска: ранжирование
• … WHERE MATCH(’depeche mode’) /* no i_f_l */
| id
| weight() | title
|
+-------+----------+------------------------------------------------------+
| 12659 |
2695 | eMOTIVe
|
| 69856 |
2695 | Random Thoughts
|
| 42194 |
2673 | Campus Invasion tour at FIU
|
| 3146 |
2642 |
|
| 6054 |
2642 | Когда я не нахожу себе места...
|
| 7142 |
2642 | ....
|
| 16695 |
2642 | приветствие)))
|
| 17325 |
2642 | DM и Cesaria Evora
|
| 18713 |
2642 | Музыка mp3
|
| 23891 |
2642 | Messages
|
2. Про качество поиска: ранжирование
• … OPTION ranker=expr('1000000*(sum(lcs)+bm25a(1.2,0.7))')
| id
| weight() | title
|
+-------+----------+------------------------------------+
| 3146 | 2716617 |
|
| 16695 | 2709227 | приветствие)))
| 12659 | 2698512 | eMOTIVe
|
| 69856 | 2682182 | Random Thoughts
|
| 24204 | 2680355 | he never told me his name
|
| 17325 | 2663691 | DM и Cesaria Evora
|
| 42781 | 2657857 | Handle Your Scandal
|
| 84337 | 2651555 |
|
| 23891 | 2648728 | Messages
|
| 40876 | 2646811 | Ganking from bob....... once again |
2. Про качество поиска: ранжирование
mysql> select id, packedfactors() from lj where match('the i')
limit 1 option ranker=expr('1')
id: 14
packedfactors(): bm25=487, bm25a=0.482982, field_mask=2,
doc_word_count=2,
field1=(lcs=1, hit_count=4, word_count=2, tf_idf=-0.045190,
min_idf=-0.012686, max_idf=-0.007131, sum_idf=-0.019817,
min_hit_pos=254, min_best_span_pos=254, exact_hit=0,
max_window_hits=1, min_gaps=1, exact_order=1, lccs=1,
wlccs=-0.012686, atc=0.000063),
word0=(tf=1, idf=-0.007131),
word1=(tf=3, idf=-0.012686)
2. Про качество поиска: ранжирование
• PACKEDFACTORS()
=> много циииферок!
+ данные ассессорских оценок (еще циииферки!)
=> машинное обучение
=> модель в UDF, sphinx_get_XXX_factors()
=> вложенные SELECT для переранжирования
= элитный поиск!!!
• NDCG boost = ?
19692003
2007+
3. Про JSON
•
•
•
•

NoSQL это модно! Даешь optionally schemaless! ©
2.1: частичная поддержка, { toplevel: “value” }
2.2: полная поддержка, массивы, подобъекты
Умеренно эффективный внутренний формат
• Блум-фильтр ключей, типизированные массивы

• sql_attr_json, rt_attr_json
• json_autoconv_numbers, json_autoconv_keynames
3. Про JSON: что можно?
•
•
•
•
•

SELECT j.key1, BIGINT(j.abc.def[3][x+456])…
... WHERE j.key1=123
… ORDER BY j.key1[3] ASC, … GROUP BY j.key1[3]
INSERT INTO rt (id, j) VALUES (123, '{x:[3,7,40]}')
SELECT id, ANY(t=3 FOR t IN j.x) FROM rt
• ALL(), ANY(), INDEXOF()

• UPDATE rt SET j.scalar=123 WHERE id=456
3. Про JSON: что (пока) нельзя?
• 2.1 поддерживает только { toplevel: ”value” }
• Нужно пользоваться 2.2

• Лимит в 4 GB JSON и строк на индекс
• Нужно шардить

• UPDATE не может добавлять, удалять ключи
• UPDATE не может менять тип, длину значений
• Нужно пользоваться REPLACE
3. Про JSON: скорость
• Алярм! По умолчанию значение это строка!!!
• 0.566 sec, SELECT * FROM lj ORDER BY j.c
• 0.038 sec, SELECT id, INTEGER(j.c) cc, title FROM lj
ORDER BY cc ASC
• 0.032 sec, SELECT id, c, title FROM lj ORDER BY c ASC

• Разница от 18% до 18 раз
• Знаешь тип => помоги движку!
4. Про более динамические индексы
• ALTER TABLE diskindex ADD COLUMN moo INTEGER
• ALTER TABLE rtindex ADD COLUMN moo INTEGER
• Пока нету ALTER TABLE rtindex DROP COLUMN moo

• ATTACH INDEX megabatch TO RTINDEX myrtindex
• myrtindex теперь может быть НЕ пустым!

• OPTIMIZE INDEX myrtindex
5. Про три спец-функции
•
•
•
•

Номер 1, механизм табличных функций
Можно полностью поменять result set
Пока только одна и встроенная, REMOVE_REPEATS
Планирую добавить UDF интерфейс
• Или сразу уже пора скрипты?!
• Голосуем, лес рук!!!!
5. Про три спец-функции
•
•
•
•

Номер 2, сделали GROUP <N> BY
Сделали группировку по нескольким ключам
Сделали поддержку HAVING
GROUP <N> BY aaa, bbb, ccc
WITHIN GROUP ORDER BY ddd ASC, eee DESC
HAVING fff
• И все это вроде как работает!!!
5. Про три спец-функции
mysql> SELECT id, channel_id FROM lj GROUP 2 BY channel_id
LIMIT 4;
+------+------------+
| id

| channel_id |

+------+------------+

|

1 |

1107024 |

|

2 |

1107024 |

|

5 |

1107004 |

|

6 |

1107004 |

+------+------------+
5. Про три спец-функции
• Номер 3, сделали max_predicted_time
• predicted_time_costs =
doc=A, hit=B, skip=C, match=D # наносекунды
• predicted_time =
A*docs + B*hits + C*matches + D*skips
• OPTION max_predicted_time=100 # миллисекунды
• Стабильная терминация
• + Внезапно, аккаунтинг ресурсов!
6. Про инструментирование
• Что такое инструментирование?
• Это как клининг-менеджер, да?
6. Про инструментирование
• Профилирование, трассировка, счетчики, логи…
•
•
•
•
•

SET profiling=1
SHOW PROFILE
SHOW PLAN
SHOW INDEX myindex STATUS
iostats, cpustats, predict_counters in SHOW META
6. Про инструментирование
mysql> SET profiling=1; SELECT * FROM lj WHERE MATCH(’the who’); SHOW PROFILE;
...
+--------------+----------+----------+---------+
| read_docs
| 0.000197 | 2
| 1.23
|
| Status
| Duration | Switches | Percent |
| read_hits
| 0.000347 | 22
| 2.16
|
+--------------+----------+----------+---------+
| get_docs
| 0.002969 | 151
| 18.48
|
| unknown
| 0.001153 | 6
| 7.18
|
| get_hits
| 0.003537 | 609
| 22.02
|
| net_read
| 0.000007 | 1
| 0.04
|
| filter
| 0.000276 | 147
| 1.72
|
| dist_connect | 0.000001 | 1
| 0.01
|
| rank
| 0.004032 | 748
| 25.10
|
| local_search | 0.000075 | 1
| 0.47
|
| sort
| 0.001183 | 33
| 7.36
|
| sql_parse
| 0.000275 | 1
| 1.71
|
| finalize
| 0.000694 | 1
| 4.32
|
| dict_setup
| 0.000002 | 1
| 0.01
|
| dist_wait
| 0.000002 | 1
| 0.01
|
| parse
| 0.000083 | 1
| 0.52
|
| aggregate
| 0.000069 | 1
| 0.43
|
| transforms
| 0.000003 | 1
| 0.02
|
| net_write
| 0.000034 | 1
| 0.21
|
| init
| 0.001014 | 3
| 6.31
|
| total
| 0.016065 | 1733
| 0
|
| open
| 0.000112 | 1
| 0.70
|
+--------------+----------+----------+---------+
...
22 rows in set (0.00 sec)
6. Про инструментирование
mysql> SET profiling=1; SELECT ...; SHOW PROFILE;
+--------------+----------+----------+---------+
| Status
| Duration | Switches | Percent |
+--------------+----------+----------+---------+
| unknown
| 0.001153 | 6
| 7.18
|
...
| read_docs
| 0.000197 | 2
| 1.23
|
| read_hits
| 0.000347 | 22
| 2.16
|
| get_docs
| 0.002969 | 151
| 18.48
|
| get_hits
| 0.003537 | 609
| 22.02
|
| filter
| 0.000276 | 147
| 1.72
|
| rank
| 0.004032 | 748
| 25.10
|
| sort
| 0.001183 | 33
| 7.36
|
| finalize
| 0.000694 | 1
| 4.32
|
...
6. Про инструментирование
mysql> SELECT * FROM test
WHERE MATCH('@title abc* @body hey') G
SHOW PLAN G
...
Variable: transformed_tree
Value: AND(
OR(fields=(title), KEYWORD(abcx, querypos=1,
expanded), KEYWORD(abcm, querypos=1, expanded)),
AND(fields=(body), KEYWORD(hey, querypos=2)))
6. Про инструментирование
mysql> SHOW INDEX lj STATUS;
+-------------------+-----------+
| Variable_name
| Value
|
+-------------------+-----------+
| index_type
| disk
|
| indexed_documents | 99984
|
| indexed_bytes
| 129481542 |
| ram_bytes
| 11945925 |
| disk_bytes
| 89392682 |
+-------------------+-----------+
5 rows in set (0.00 sec)
6. Про инструментирование
mysql> select * from lj where match('the who')
OPTION max_predicted_time=1000000; # also --iostats --cpustats
SHOW META;
...
+-------------------------+--------+
| fetched_docs
| 75190 |
| Variable_name
| Value |
| fetched_hits
| 262942 |
+-------------------------+--------+
| fetched_skips
| 148
|
| total
| 1000
|
| keyword[0]
| the
|
| total_found
| 16207 |
| docs[0]
| 58128 |
| time
| 0.013 |
| hits[0]
| 460421 |
| prediction_fetched_docs | 75190 |
| keyword[1]
| who
|
| prediction_fetched_hits | 262942 |
| docs[1]
| 17175 |
| prediction_skips
| 148
|
| hits[1]
| 32456 |
| predicted_time
| 18
|
+-------------------------+--------+
| dist_predicted_time
| 0
|
17 rows in set (0.00 sec)
7. Про оптимизации
• Вкрации ™ стало быстрее!!!
• Местами В РАЗЫ
• Скиплисты, GEODIST, мегасхемы, JSON,
токенизация, индексация XML, биграммы,
сниппеты…
7. Про оптимизации: что включить
• Скиплисты, [редкое частое], [the who]
• В среднем 1.7x раза (*) на тестовой коллекции LJ1M
• В пределе до 100x раз (*) на синтетических (?) тестах
• Как включить? Либо просто ребилд, либо --buildskips

• Биграммы, [“редкое любое”], [“back to school”]
• => либо “back+to to+school” либо “back to+school”
• Как включить? bigram_freq_words, bigram_index
7. Про оптимизации: что автоматом
• Быстрее токенизатор => индексация, сниппеты
• Индексация до 1.25x раз, сниппеты до 1.6x (*) раз

• Быстрее фильтрация => спецслучаи
• Спецкод для WHERE arg=value
• Спецкод для 2, 3 условий через AND

• Быстрее обработка схем в SELECT, UPDATE
• От 1.02x до 3.5x (!) раз на гигантских схемах
7. Про оптимизации: что автоматом
• Быстрее доступ к JSON
• Спецкод для j.key1 случая, ~20%
• Начиная с 2.2 укладываем по порядку, ~20%

• Быстрее и едят СИЛЬНО меньше памяти сниппеты
• 32 MB док, было 970 MB, стало 50 MB
• Ведем работы про внедрение forward index cache

• Быстрее, умнее и точнее (!) GEODIST(a,b,c,d,
{in=deg, out=mi, method=adaptive})
8. А что еще?
•
•
•
•
•
•
•
•
•
•

Поиск по маске, [t?st*]
Двойная буферизация RT (нет задержек INSERT)
POLY2D(), GEOPOLY2D(), CONTAINS()
Многопоточный опрос удаленных нод (агентов)
Поиск в любых списках, SELECT … FROM dist1,dist2,local3 …
Вложенные выборки, SELECT * FROM (SELECT …) ORDER BY …
Строки в UDF функциях, CREATE FUNCTION … RETURNS STRING
Оператор ZONESPAN:xxx, функция ZONESPANLIST()
Агрегатная функция GROUP_CONCAT()
...и еще всякие “мелочи” 
“Итоги подведем” © Гамлет
Чуть обсудили новости 2013: agent_mirror, ha_strategy,
stem_ar, lemmatize_ru, _en, _de, _all, RLP segmenter,
wordbreaker, regexp_filter, BM25F, global_idf, local_df,
index_field_lengths, wlccs, atc, PACKEDFACTORS,
rt_attr_json, ANY(), ALL(), ALTER TABLE, ATTACH INDEX,
OPTIMIZE INDEX, tablefuncs, GROUP <N> BY key1,key2
HAVING, SHOW PROFILE, SHOW PLAN, max_predicted_time,
SHOW INDEX STATUS, bigram_index, POLY2D, GEODIST, subSELECT, ZONESPAN, GROUP_CONCAT ...
“Итоги подведем” © Гамлет
• HA/LB, качество поиска, мега-оптимизации, JSON,
ALTER, ATTACH, GEODIST, wildcards, OPTIMIZE,
double INSERT buffer… многое стало лучше ;)
• А многое еще станет!!!

• Хотите еще подробнее? Кулуары, мастер-класс
• Хотите еще короче? Консультации ;)
Вопросы!
• shodan@sphinxsearch.com
• skype:shodanium
• http://slideshare.net/shodan/
• @shodanium #highload2013

Contenu connexe

Tendances

Web осень 2013 лекция 9
Web осень 2013 лекция 9Web осень 2013 лекция 9
Web осень 2013 лекция 9
Technopark
 
Web осень 2013 лекция 2
Web осень 2013 лекция 2Web осень 2013 лекция 2
Web осень 2013 лекция 2
Technopark
 
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Ontico
 
CC HackQuest 2010 Full Disclosure (мастер-класс)
CC HackQuest 2010 Full Disclosure (мастер-класс)CC HackQuest 2010 Full Disclosure (мастер-класс)
CC HackQuest 2010 Full Disclosure (мастер-класс)
Dmitry Evteev
 
Web осень 2013 лекция 3
Web осень 2013 лекция 3Web осень 2013 лекция 3
Web осень 2013 лекция 3
Technopark
 
Алексей Бережной — «jQuery»
Алексей Бережной — «jQuery»Алексей Бережной — «jQuery»
Алексей Бережной — «jQuery»
Yandex
 
Новые возможности отладки MySQL 5.7 на практике
Новые возможности отладки MySQL 5.7 на практикеНовые возможности отладки MySQL 5.7 на практике
Новые возможности отладки MySQL 5.7 на практике
Sveta Smirnova
 

Tendances (20)

Web осень 2013 лекция 9
Web осень 2013 лекция 9Web осень 2013 лекция 9
Web осень 2013 лекция 9
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3
 
Web осень 2013 лекция 2
Web осень 2013 лекция 2Web осень 2013 лекция 2
Web осень 2013 лекция 2
 
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
 
Лекция 5. Встроенные коллекции и модуль collections.
Лекция 5. Встроенные коллекции и модуль collections.Лекция 5. Встроенные коллекции и модуль collections.
Лекция 5. Встроенные коллекции и модуль collections.
 
Лекция 4. Строки, байты, файлы и ввод/вывод.
 Лекция 4. Строки, байты, файлы и ввод/вывод. Лекция 4. Строки, байты, файлы и ввод/вывод.
Лекция 4. Строки, байты, файлы и ввод/вывод.
 
Работа с БД в Drupal 7
Работа с БД в Drupal 7Работа с БД в Drupal 7
Работа с БД в Drupal 7
 
Python dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущееPython dict: прошлое, настоящее, будущее
Python dict: прошлое, настоящее, будущее
 
PostgreSQL performance recipes
PostgreSQL performance recipesPostgreSQL performance recipes
PostgreSQL performance recipes
 
Профилирование и отладка Django
Профилирование и отладка DjangoПрофилирование и отладка Django
Профилирование и отладка Django
 
Learning from Swift sources, Иван Сметанин
Learning from Swift sources, Иван СметанинLearning from Swift sources, Иван Сметанин
Learning from Swift sources, Иван Сметанин
 
CC HackQuest 2010 Full Disclosure (мастер-класс)
CC HackQuest 2010 Full Disclosure (мастер-класс)CC HackQuest 2010 Full Disclosure (мастер-класс)
CC HackQuest 2010 Full Disclosure (мастер-класс)
 
Web осень 2013 лекция 3
Web осень 2013 лекция 3Web осень 2013 лекция 3
Web осень 2013 лекция 3
 
Алексей Бережной — «jQuery»
Алексей Бережной — «jQuery»Алексей Бережной — «jQuery»
Алексей Бережной — «jQuery»
 
Лекция 1. Начало.
Лекция 1. Начало.Лекция 1. Начало.
Лекция 1. Начало.
 
Authentication security
Authentication securityAuthentication security
Authentication security
 
тестирование защищенности веб приложений
тестирование защищенности веб приложенийтестирование защищенности веб приложений
тестирование защищенности веб приложений
 
Новые возможности отладки MySQL 5.7 на практике
Новые возможности отладки MySQL 5.7 на практикеНовые возможности отладки MySQL 5.7 на практике
Новые возможности отладки MySQL 5.7 на практике
 
Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 2. Всё, что вы хотели знать о функциях в Python.Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 2. Всё, что вы хотели знать о функциях в Python.
 
Haskell - huge presentation for DevDay about Haskell language
Haskell - huge presentation for DevDay about Haskell languageHaskell - huge presentation for DevDay about Haskell language
Haskell - huge presentation for DevDay about Haskell language
 

En vedette

В поисках идеальной сети, или зачем нужна еще одна SDN / Андрей Королев (Ионика)
В поисках идеальной сети, или зачем нужна еще одна SDN / Андрей Королев (Ионика)В поисках идеальной сети, или зачем нужна еще одна SDN / Андрей Королев (Ионика)
В поисках идеальной сети, или зачем нужна еще одна SDN / Андрей Королев (Ионика)
Ontico
 
Учебный план для highload гуру / Андрей Аксёнов (Sphinx Technologies Inc.)
Учебный план для highload гуру / Андрей Аксёнов (Sphinx Technologies Inc.)Учебный план для highload гуру / Андрей Аксёнов (Sphinx Technologies Inc.)
Учебный план для highload гуру / Андрей Аксёнов (Sphinx Technologies Inc.)
Ontico
 
Frontera распределенный робот для обхода веба в больших объемах / Александр С...
Frontera распределенный робот для обхода веба в больших объемах / Александр С...Frontera распределенный робот для обхода веба в больших объемах / Александр С...
Frontera распределенный робот для обхода веба в больших объемах / Александр С...
Ontico
 
Cisco TrustSec и Cisco ISE
Cisco TrustSec и Cisco ISECisco TrustSec и Cisco ISE
Cisco TrustSec и Cisco ISE
Cisco Russia
 
Как сделать высоконагруженный сервис, не зная количество нагрузки / Олег Обле...
Как сделать высоконагруженный сервис, не зная количество нагрузки / Олег Обле...Как сделать высоконагруженный сервис, не зная количество нагрузки / Олег Обле...
Как сделать высоконагруженный сервис, не зная количество нагрузки / Олег Обле...
Ontico
 

En vedette (7)

В поисках идеальной сети, или зачем нужна еще одна SDN / Андрей Королев (Ионика)
В поисках идеальной сети, или зачем нужна еще одна SDN / Андрей Королев (Ионика)В поисках идеальной сети, или зачем нужна еще одна SDN / Андрей Королев (Ионика)
В поисках идеальной сети, или зачем нужна еще одна SDN / Андрей Королев (Ионика)
 
Учебный план для highload гуру / Андрей Аксёнов (Sphinx Technologies Inc.)
Учебный план для highload гуру / Андрей Аксёнов (Sphinx Technologies Inc.)Учебный план для highload гуру / Андрей Аксёнов (Sphinx Technologies Inc.)
Учебный план для highload гуру / Андрей Аксёнов (Sphinx Technologies Inc.)
 
VMware NSX и интеграция с продуктами Juniper
VMware NSX и интеграция с  продуктами JuniperVMware NSX и интеграция с  продуктами Juniper
VMware NSX и интеграция с продуктами Juniper
 
Frontera распределенный робот для обхода веба в больших объемах / Александр С...
Frontera распределенный робот для обхода веба в больших объемах / Александр С...Frontera распределенный робот для обхода веба в больших объемах / Александр С...
Frontera распределенный робот для обхода веба в больших объемах / Александр С...
 
Cisco TrustSec и Cisco ISE
Cisco TrustSec и Cisco ISECisco TrustSec и Cisco ISE
Cisco TrustSec и Cisco ISE
 
Как сделать высоконагруженный сервис, не зная количество нагрузки / Олег Обле...
Как сделать высоконагруженный сервис, не зная количество нагрузки / Олег Обле...Как сделать высоконагруженный сервис, не зная количество нагрузки / Олег Обле...
Как сделать высоконагруженный сервис, не зная количество нагрузки / Олег Обле...
 
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
 

Similaire à Андрей Аксёнов, Sphinx Technologies Inc.

Современному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
Современному хайлоду - современные решения: MySQL 8.0 и улучшения PerconaСовременному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
Современному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
Sveta Smirnova
 
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
Ontico
 
MongoDB. Области применения, преимущества и узкие места, тонкости использован...
MongoDB. Области применения, преимущества и узкие места, тонкости использован...MongoDB. Области применения, преимущества и узкие места, тонкости использован...
MongoDB. Области применения, преимущества и узкие места, тонкости использован...
phpdevby
 
Расширяемость PostgreSQL для хакеров и архитекторов / Олег Бартунов, Александ...
Расширяемость PostgreSQL для хакеров и архитекторов / Олег Бартунов, Александ...Расширяемость PostgreSQL для хакеров и архитекторов / Олег Бартунов, Александ...
Расширяемость PostgreSQL для хакеров и архитекторов / Олег Бартунов, Александ...
Ontico
 
Sphinx. настройка, эксплуатация
Sphinx. настройка, эксплуатацияSphinx. настройка, эксплуатация
Sphinx. настройка, эксплуатация
andreyborue
 

Similaire à Андрей Аксёнов, Sphinx Technologies Inc. (20)

MariaDB 10.1 - что нового.
MariaDB 10.1 - что нового.MariaDB 10.1 - что нового.
MariaDB 10.1 - что нового.
 
Современному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
Современному хайлоду - современные решения: MySQL 8.0 и улучшения PerconaСовременному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
Современному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
 
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
 
MongoDB. Области применения, преимущества и узкие места, тонкости использован...
MongoDB. Области применения, преимущества и узкие места, тонкости использован...MongoDB. Области применения, преимущества и узкие места, тонкости использован...
MongoDB. Области применения, преимущества и узкие места, тонкости использован...
 
SPA инструменты
SPA инструментыSPA инструменты
SPA инструменты
 
Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"Михаил Щербаков "WinDbg сотоварищи"
Михаил Щербаков "WinDbg сотоварищи"
 
Сверхоптимизация кода на Python
Сверхоптимизация кода на PythonСверхоптимизация кода на Python
Сверхоптимизация кода на Python
 
Сверхоптимизация кода на Python
Сверхоптимизация кода на PythonСверхоптимизация кода на Python
Сверхоптимизация кода на Python
 
Поиск? Sphinx!
Поиск? Sphinx!Поиск? Sphinx!
Поиск? Sphinx!
 
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьСергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
 
WinDbg со товарищи
WinDbg со товарищиWinDbg со товарищи
WinDbg со товарищи
 
Расширяемость PostgreSQL для хакеров и архитекторов / Олег Бартунов, Александ...
Расширяемость PostgreSQL для хакеров и архитекторов / Олег Бартунов, Александ...Расширяемость PostgreSQL для хакеров и архитекторов / Олег Бартунов, Александ...
Расширяемость PostgreSQL для хакеров и архитекторов / Олег Бартунов, Александ...
 
Иван Фролков
Иван ФролковИван Фролков
Иван Фролков
 
Sphinx. настройка, эксплуатация
Sphinx. настройка, эксплуатацияSphinx. настройка, эксплуатация
Sphinx. настройка, эксплуатация
 
20131105 романенко
20131105 романенко20131105 романенко
20131105 романенко
 
Andrew Aksyonoff "Архитектура вокруг поиска"
Andrew Aksyonoff "Архитектура вокруг поиска"Andrew Aksyonoff "Архитектура вокруг поиска"
Andrew Aksyonoff "Архитектура вокруг поиска"
 
Тестирование защищенности веб-приложений
Тестирование защищенности веб-приложенийТестирование защищенности веб-приложений
Тестирование защищенности веб-приложений
 
Мастер класс по алгоритмам. Часть 1
Мастер класс по алгоритмам. Часть 1Мастер класс по алгоритмам. Часть 1
Мастер класс по алгоритмам. Часть 1
 
WinDbg в руках .NET разработчика
WinDbg в руках .NET разработчикаWinDbg в руках .NET разработчика
WinDbg в руках .NET разработчика
 
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьТо, что вы хотели знать о HandlerSocket, но не смогли нагуглить
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
 

Plus de Ontico

Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Ontico
 

Plus de Ontico (20)

One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
 
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
 
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
 
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
 
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
 
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
 
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
 
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
 
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
 
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
 
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
 
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
 
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
 
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
 
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
 

Андрей Аксёнов, Sphinx Technologies Inc.

  • 2. Что такое Sphinx • • • • • • Сервер текстового поиска, http://sphinxsearch.com Нет, не как Google/Yandex/Bing Да, как Solr/Elastic/FAST/Verity/Autonomy/Yserver Открытые исходники, бесплатный, GPL 300M+ запросов/сутки, 50+ TB коллекции Кроме “просто поиска” умеет кучу всего
  • 3. Про что доклад • • • • • Sphinx 2.1 == начали в 2012, выкатили в 2013 Sphinx 2.2 == начали в 2013, выкатим в 2013 ~50 новых фич в 2.1 ~40 новых фич в 2.2 Но фича, это может быть много…
  • 4.
  • 5. Галопом по вершкам • Линейка 2.1.x • Встроенный адаптивный HA/LB • Качество поиска • Сигналы ранжирования, RU морфология, wordbreaker • Начальная поддержка JSON • Инструментирование (профайлинг на стероидах) • Оптимизации! • Бета в марте, релиз в октябре
  • 6. Галопом по вершкам • Линейка 2.2.x • Манипуляции индексами, ALTER, ATTACH • Качество поиска • Сигналы + UDF v2, EN/DE/CN морфология, local_df • Полная поддержка JSON • Cпецфункции, GROUP <N> BY, табличные функции • Оптимизации! • Бета в октябре, релиз... принимаю ставки!
  • 7. 1. Про встроенный HA/LB • Виды кластеров? • • • • 1 шард, N реплик => HAProxy M шардов, 1 реплика => HAProxy (+бэкапы!) M шардов, N реплик => HAProxy  M шардов, N реплик, выбросы/гетерогено => HA/LB • Читать про agent_mirror, ha_strategy, и т.д. • Говорят, подробнее в следующем докладе
  • 8. 2. Про качество поиска • Качество поиска это НЕ ранжирование!
  • 9.
  • 10.
  • 11.
  • 12. 2. Про качество поиска • Качество поиска это НЕ ранжирование • Токенизация, морфология, обработка при индексации • Анализ и переписывание запросов при поиске • Кворум, коррекция транслита/опечаток, расширения, и т.д. • 1 поиск => 1…3+ запроса к серверу • Ассессорские оценки качества • Формула ранжирования • Shameless plug: звоните, проконсультируем!!!
  • 13. 2. Про качество поиска: морфология • stem_ar • lemmatize_ru, _en, _de • stem(BUSY) == BUSI, stem(BUSINESS) == BUSI • lemma(BUSY) == BUSY, lemma(BUSINESS) == BUSINESS • lemmatize_ru_all, _en_all, _de_all • lemma(LEFT) == [LEAVE, LEFT] • “He left us. Make a left turn.” • “Поручик, это у вас что?!”
  • 14. 2. Про качество поиска: обработка • $ echo lordofthering expertsexchange.com | bin/wordbreaker --dict dict.txt split lord of the rings experts exchange • regexp_filter • wordforms = postmorph.txt: ~run > walk # maps all of run, runs, running
  • 15. 2. Про качество поиска: ранжирование • index_field_lengths, BM25A(), BM25F() • global_idf, local_df, OPTION idf=plain, normalized, etc • lccs, wlccs, exact_order, min_gaps, atc, min_idf, max_idf, sum_idf • PACKEDFACTORS() • sphinx_get_XXX_factors()
  • 16. 2. Про качество поиска: ранжирование • … WHERE MATCH(’depeche mode’) /* no i_f_l */ | id | weight() | title | +-------+----------+------------------------------------------------------+ | 12659 | 2695 | eMOTIVe | | 69856 | 2695 | Random Thoughts | | 42194 | 2673 | Campus Invasion tour at FIU | | 3146 | 2642 | | | 6054 | 2642 | Когда я не нахожу себе места... | | 7142 | 2642 | .... | | 16695 | 2642 | приветствие))) | | 17325 | 2642 | DM и Cesaria Evora | | 18713 | 2642 | Музыка mp3 | | 23891 | 2642 | Messages |
  • 17. 2. Про качество поиска: ранжирование • … OPTION ranker=expr('1000000*(sum(lcs)+bm25a(1.2,0.7))') | id | weight() | title | +-------+----------+------------------------------------+ | 3146 | 2716617 | | | 16695 | 2709227 | приветствие))) | 12659 | 2698512 | eMOTIVe | | 69856 | 2682182 | Random Thoughts | | 24204 | 2680355 | he never told me his name | | 17325 | 2663691 | DM и Cesaria Evora | | 42781 | 2657857 | Handle Your Scandal | | 84337 | 2651555 | | | 23891 | 2648728 | Messages | | 40876 | 2646811 | Ganking from bob....... once again |
  • 18. 2. Про качество поиска: ранжирование mysql> select id, packedfactors() from lj where match('the i') limit 1 option ranker=expr('1') id: 14 packedfactors(): bm25=487, bm25a=0.482982, field_mask=2, doc_word_count=2, field1=(lcs=1, hit_count=4, word_count=2, tf_idf=-0.045190, min_idf=-0.012686, max_idf=-0.007131, sum_idf=-0.019817, min_hit_pos=254, min_best_span_pos=254, exact_hit=0, max_window_hits=1, min_gaps=1, exact_order=1, lccs=1, wlccs=-0.012686, atc=0.000063), word0=(tf=1, idf=-0.007131), word1=(tf=3, idf=-0.012686)
  • 19. 2. Про качество поиска: ранжирование • PACKEDFACTORS() => много циииферок! + данные ассессорских оценок (еще циииферки!) => машинное обучение => модель в UDF, sphinx_get_XXX_factors() => вложенные SELECT для переранжирования = элитный поиск!!! • NDCG boost = ?
  • 20.
  • 22. 2007+
  • 23. 3. Про JSON • • • • NoSQL это модно! Даешь optionally schemaless! © 2.1: частичная поддержка, { toplevel: “value” } 2.2: полная поддержка, массивы, подобъекты Умеренно эффективный внутренний формат • Блум-фильтр ключей, типизированные массивы • sql_attr_json, rt_attr_json • json_autoconv_numbers, json_autoconv_keynames
  • 24. 3. Про JSON: что можно? • • • • • SELECT j.key1, BIGINT(j.abc.def[3][x+456])… ... WHERE j.key1=123 … ORDER BY j.key1[3] ASC, … GROUP BY j.key1[3] INSERT INTO rt (id, j) VALUES (123, '{x:[3,7,40]}') SELECT id, ANY(t=3 FOR t IN j.x) FROM rt • ALL(), ANY(), INDEXOF() • UPDATE rt SET j.scalar=123 WHERE id=456
  • 25. 3. Про JSON: что (пока) нельзя? • 2.1 поддерживает только { toplevel: ”value” } • Нужно пользоваться 2.2 • Лимит в 4 GB JSON и строк на индекс • Нужно шардить • UPDATE не может добавлять, удалять ключи • UPDATE не может менять тип, длину значений • Нужно пользоваться REPLACE
  • 26. 3. Про JSON: скорость • Алярм! По умолчанию значение это строка!!! • 0.566 sec, SELECT * FROM lj ORDER BY j.c • 0.038 sec, SELECT id, INTEGER(j.c) cc, title FROM lj ORDER BY cc ASC • 0.032 sec, SELECT id, c, title FROM lj ORDER BY c ASC • Разница от 18% до 18 раз • Знаешь тип => помоги движку!
  • 27. 4. Про более динамические индексы • ALTER TABLE diskindex ADD COLUMN moo INTEGER • ALTER TABLE rtindex ADD COLUMN moo INTEGER • Пока нету ALTER TABLE rtindex DROP COLUMN moo • ATTACH INDEX megabatch TO RTINDEX myrtindex • myrtindex теперь может быть НЕ пустым! • OPTIMIZE INDEX myrtindex
  • 28. 5. Про три спец-функции • • • • Номер 1, механизм табличных функций Можно полностью поменять result set Пока только одна и встроенная, REMOVE_REPEATS Планирую добавить UDF интерфейс • Или сразу уже пора скрипты?! • Голосуем, лес рук!!!!
  • 29. 5. Про три спец-функции • • • • Номер 2, сделали GROUP <N> BY Сделали группировку по нескольким ключам Сделали поддержку HAVING GROUP <N> BY aaa, bbb, ccc WITHIN GROUP ORDER BY ddd ASC, eee DESC HAVING fff • И все это вроде как работает!!!
  • 30. 5. Про три спец-функции mysql> SELECT id, channel_id FROM lj GROUP 2 BY channel_id LIMIT 4; +------+------------+ | id | channel_id | +------+------------+ | 1 | 1107024 | | 2 | 1107024 | | 5 | 1107004 | | 6 | 1107004 | +------+------------+
  • 31. 5. Про три спец-функции • Номер 3, сделали max_predicted_time • predicted_time_costs = doc=A, hit=B, skip=C, match=D # наносекунды • predicted_time = A*docs + B*hits + C*matches + D*skips • OPTION max_predicted_time=100 # миллисекунды • Стабильная терминация • + Внезапно, аккаунтинг ресурсов!
  • 32. 6. Про инструментирование • Что такое инструментирование? • Это как клининг-менеджер, да?
  • 33.
  • 34.
  • 35. 6. Про инструментирование • Профилирование, трассировка, счетчики, логи… • • • • • SET profiling=1 SHOW PROFILE SHOW PLAN SHOW INDEX myindex STATUS iostats, cpustats, predict_counters in SHOW META
  • 36. 6. Про инструментирование mysql> SET profiling=1; SELECT * FROM lj WHERE MATCH(’the who’); SHOW PROFILE; ... +--------------+----------+----------+---------+ | read_docs | 0.000197 | 2 | 1.23 | | Status | Duration | Switches | Percent | | read_hits | 0.000347 | 22 | 2.16 | +--------------+----------+----------+---------+ | get_docs | 0.002969 | 151 | 18.48 | | unknown | 0.001153 | 6 | 7.18 | | get_hits | 0.003537 | 609 | 22.02 | | net_read | 0.000007 | 1 | 0.04 | | filter | 0.000276 | 147 | 1.72 | | dist_connect | 0.000001 | 1 | 0.01 | | rank | 0.004032 | 748 | 25.10 | | local_search | 0.000075 | 1 | 0.47 | | sort | 0.001183 | 33 | 7.36 | | sql_parse | 0.000275 | 1 | 1.71 | | finalize | 0.000694 | 1 | 4.32 | | dict_setup | 0.000002 | 1 | 0.01 | | dist_wait | 0.000002 | 1 | 0.01 | | parse | 0.000083 | 1 | 0.52 | | aggregate | 0.000069 | 1 | 0.43 | | transforms | 0.000003 | 1 | 0.02 | | net_write | 0.000034 | 1 | 0.21 | | init | 0.001014 | 3 | 6.31 | | total | 0.016065 | 1733 | 0 | | open | 0.000112 | 1 | 0.70 | +--------------+----------+----------+---------+ ... 22 rows in set (0.00 sec)
  • 37. 6. Про инструментирование mysql> SET profiling=1; SELECT ...; SHOW PROFILE; +--------------+----------+----------+---------+ | Status | Duration | Switches | Percent | +--------------+----------+----------+---------+ | unknown | 0.001153 | 6 | 7.18 | ... | read_docs | 0.000197 | 2 | 1.23 | | read_hits | 0.000347 | 22 | 2.16 | | get_docs | 0.002969 | 151 | 18.48 | | get_hits | 0.003537 | 609 | 22.02 | | filter | 0.000276 | 147 | 1.72 | | rank | 0.004032 | 748 | 25.10 | | sort | 0.001183 | 33 | 7.36 | | finalize | 0.000694 | 1 | 4.32 | ...
  • 38. 6. Про инструментирование mysql> SELECT * FROM test WHERE MATCH('@title abc* @body hey') G SHOW PLAN G ... Variable: transformed_tree Value: AND( OR(fields=(title), KEYWORD(abcx, querypos=1, expanded), KEYWORD(abcm, querypos=1, expanded)), AND(fields=(body), KEYWORD(hey, querypos=2)))
  • 39. 6. Про инструментирование mysql> SHOW INDEX lj STATUS; +-------------------+-----------+ | Variable_name | Value | +-------------------+-----------+ | index_type | disk | | indexed_documents | 99984 | | indexed_bytes | 129481542 | | ram_bytes | 11945925 | | disk_bytes | 89392682 | +-------------------+-----------+ 5 rows in set (0.00 sec)
  • 40. 6. Про инструментирование mysql> select * from lj where match('the who') OPTION max_predicted_time=1000000; # also --iostats --cpustats SHOW META; ... +-------------------------+--------+ | fetched_docs | 75190 | | Variable_name | Value | | fetched_hits | 262942 | +-------------------------+--------+ | fetched_skips | 148 | | total | 1000 | | keyword[0] | the | | total_found | 16207 | | docs[0] | 58128 | | time | 0.013 | | hits[0] | 460421 | | prediction_fetched_docs | 75190 | | keyword[1] | who | | prediction_fetched_hits | 262942 | | docs[1] | 17175 | | prediction_skips | 148 | | hits[1] | 32456 | | predicted_time | 18 | +-------------------------+--------+ | dist_predicted_time | 0 | 17 rows in set (0.00 sec)
  • 41.
  • 42.
  • 43. 7. Про оптимизации • Вкрации ™ стало быстрее!!! • Местами В РАЗЫ • Скиплисты, GEODIST, мегасхемы, JSON, токенизация, индексация XML, биграммы, сниппеты…
  • 44. 7. Про оптимизации: что включить • Скиплисты, [редкое частое], [the who] • В среднем 1.7x раза (*) на тестовой коллекции LJ1M • В пределе до 100x раз (*) на синтетических (?) тестах • Как включить? Либо просто ребилд, либо --buildskips • Биграммы, [“редкое любое”], [“back to school”] • => либо “back+to to+school” либо “back to+school” • Как включить? bigram_freq_words, bigram_index
  • 45. 7. Про оптимизации: что автоматом • Быстрее токенизатор => индексация, сниппеты • Индексация до 1.25x раз, сниппеты до 1.6x (*) раз • Быстрее фильтрация => спецслучаи • Спецкод для WHERE arg=value • Спецкод для 2, 3 условий через AND • Быстрее обработка схем в SELECT, UPDATE • От 1.02x до 3.5x (!) раз на гигантских схемах
  • 46. 7. Про оптимизации: что автоматом • Быстрее доступ к JSON • Спецкод для j.key1 случая, ~20% • Начиная с 2.2 укладываем по порядку, ~20% • Быстрее и едят СИЛЬНО меньше памяти сниппеты • 32 MB док, было 970 MB, стало 50 MB • Ведем работы про внедрение forward index cache • Быстрее, умнее и точнее (!) GEODIST(a,b,c,d, {in=deg, out=mi, method=adaptive})
  • 47. 8. А что еще? • • • • • • • • • • Поиск по маске, [t?st*] Двойная буферизация RT (нет задержек INSERT) POLY2D(), GEOPOLY2D(), CONTAINS() Многопоточный опрос удаленных нод (агентов) Поиск в любых списках, SELECT … FROM dist1,dist2,local3 … Вложенные выборки, SELECT * FROM (SELECT …) ORDER BY … Строки в UDF функциях, CREATE FUNCTION … RETURNS STRING Оператор ZONESPAN:xxx, функция ZONESPANLIST() Агрегатная функция GROUP_CONCAT() ...и еще всякие “мелочи” 
  • 48. “Итоги подведем” © Гамлет Чуть обсудили новости 2013: agent_mirror, ha_strategy, stem_ar, lemmatize_ru, _en, _de, _all, RLP segmenter, wordbreaker, regexp_filter, BM25F, global_idf, local_df, index_field_lengths, wlccs, atc, PACKEDFACTORS, rt_attr_json, ANY(), ALL(), ALTER TABLE, ATTACH INDEX, OPTIMIZE INDEX, tablefuncs, GROUP <N> BY key1,key2 HAVING, SHOW PROFILE, SHOW PLAN, max_predicted_time, SHOW INDEX STATUS, bigram_index, POLY2D, GEODIST, subSELECT, ZONESPAN, GROUP_CONCAT ...
  • 49. “Итоги подведем” © Гамлет • HA/LB, качество поиска, мега-оптимизации, JSON, ALTER, ATTACH, GEODIST, wildcards, OPTIMIZE, double INSERT buffer… многое стало лучше ;) • А многое еще станет!!! • Хотите еще подробнее? Кулуары, мастер-класс • Хотите еще короче? Консультации ;)
  • 50.
  • 51. Вопросы! • shodan@sphinxsearch.com • skype:shodanium • http://slideshare.net/shodan/ • @shodanium #highload2013