• Индексы в PostgreSQL — 1

      Предисловие


      В этой серии статей речь пойдет об индексах в PostgreSQL.

      Любой вопрос можно рассматривать с разных точек зрения. Мы будем говорить о том, что должно интересовать прикладного разработчика, использующего СУБД: какие индексы существуют, почему в PostgreSQL их так много разных, и как их использовать для ускорения запросов. Пожалуй, тему можно было бы раскрыть и меньшим числом слов, но мы втайне надеемся на любознательного разработчика, которому также интересны и подробности внутреннего устройства, тем более, что понимание таких подробностей позволяет не только прислушиваться к чужому мнению, но и делать собственные выводы.

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

      В этой части мы поговорим про разделение сфер ответственности между общим механизмом индексирования, относящимся к ядру СУБД, и отдельными методами индексного доступа, которые в PostgreSQL можно добавлять как расширения. В следующей части мы рассмотрим интерфейс метода доступа и такие важные понятия, как классы и семейства операторов. После такого длинного, но необходимого введения мы подробно рассмотрим устройство и применение различных типов индексов: Hash, B-tree, GiST, SP-GiST, GIN и RUM, BRIN и Bloom.

      Индексы


      Индексы в PostgreSQL — специальные объекты базы данных, предназначенные в основном для ускорения доступа к данным. Это вспомогательные структуры: любой индекс можно удалить и восстановить заново по информации в таблице. Иногда приходится слышать, что СУБД может работать и без индексов, просто медленно. Однако это не так, ведь индексы служат также для поддержки некоторых ограничений целостности.
      Читать дальше →
    • Индексы в PostgreSQL — 6


        Мы уже рассмотрели механизм индексирования PostgreSQL, интерфейс методов доступа и три метода: хеш-индекс, B-дерево и GiST. В этой части речь пойдет о SP-GiST.

        SP-GiST


        Вначале немного о названии. Слово «GiST» намекает на определенную схожесть с одноименным методом. Схожесть действительно есть: и тот, и другой — generalized search trees, обобщенные деревья поиска, предоставляющие каркас для построения разных методов доступа.

        «SP» расшифровывается как space partitioning, разбиение пространства. В роли пространства часто выступает именно то, что мы и привыкли называть пространством — например, двумерная плоскость. Но, как мы увидим, имеется в виду любое пространство поиска, по сути произвольная область значений.

        SP-GiST подходит для структур, в которых пространство рекурсивно разбивается на непересекающиеся области. В этот класс входят деревья квадрантов (quadtree), k-мерные деревья (k-D tree), префиксные деревья (trie).

        Читать дальше →
      • epoll и Windows IO Completion Ports: практическая разница

          Введение


          В этой статье мы попробуем разобраться чем на практике отличается механизм epoll от портов завершения (Windows I/O Completion Port или IOCP). Это может быть интересно системным архитекторам, проектирующим высокопроизводительные сетевые сервисы или программистам, портирующим сетевой код с Windows на Linux или наоборот.

          Обе эти технологии весьма эффективны для обработки большого количества сетевых соединений.

          Они отличаются от других методов по следующим пунктам:

          • Нет ограничений (кроме общих ресурсов системы) на общее количество наблюдаемых дескрипторов и типов событий
          • Масштабирование работает достаточно хорошо — если вы уже мониторите N дескрипторов, то переход к мониторингу N + 1 займёт очень мало времени и ресурсов
          • Достаточно легко задействовать пул потоков для параллельной обработки происходящих событий
          • Нет никакого смысла использовать при единичных сетевых соединениях. Все преимущества начинают проявляться при 1000+ соединений

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

          (Upd: данная статья — перевод)

          Читать дальше →
        • Объясняем современный JavaScript динозавру

          • Перевод


          Если вы не изучали JavaScript с самого начала, то осваивать его современную версию сложно. Экосистема быстро растёт и меняется, так что трудно разобраться с проблемами, для решения которых придуманы разные инструменты. Я начал программировать в 1998-м, но начал понимать JavaScript только в 2014-м. Помню, как просматривал Browserify и смотрел на его слоган:


          Browserify позволяет делать require («модули») в браузере, объединяя все ваши зависимости


          Я не понял ни слова из предложения и стал разбираться, как это может помочь мне как разработчику.


          Цель статьи — рассказать о контексте, в котором инструменты в JavaScript развивались вплоть до 2017-го. Начнём с самого начала и будем делать сайт, как это делали бы динозавры — безо всяких инструментов, на чистом HTML и JavaScript. Постепенно станем вводить разные инструменты, поочерёдно рассматривая решаемые ими проблемы. Благодаря историческому контексту вы сможете адаптироваться к постоянно меняющемуся ландшафту JavaScript и понять его.

          Читать дальше →
        • Быстрые TCP сокеты на Erlang

            Обработка TCP соединений может запросто оказаться узким местом, когда скорость приближается к 10 тыс запросов в секунду: эффективное чтение и запись становится отдельной проблемой, а большая часть вычислительных ядер простаивает.

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

            Статья адресована как Erlang программистам, так и всем, кто просто интересуется Erlang. Глубокие знания языка не требуются.
            Читать дальше →
          • Rust в деталях: пишем масштабируемый чат с нуля, часть 1

            • Перевод

            Часть 1: Реализуем WebSocket. Введение.


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

            В первой части мы рассмотрим начальную настройку окружения и реализацию простейшего WebSocket-сервера. Чтобы понять технические детали статьи вам не потребуется опыта работы с языком Rust, хотя знание основ системных API (POSIX) и C/C++ лишним не будет. Прежде чем начинать чтение, заготовьте немного времени (и кофе) — статья описывает все максимально подробно и поэтому довольно длинная.

            Читать дальше →
          • Как я, в итоге, написал новую RTOS, протестированную и стабильную

              Я работаю со встраиваемыми системами в течение нескольких лет: наша компания разрабатывает и производит бортовые компьютеры для автомобилей, зарядные устройства, и т.д.

              image


              Процессоры, используемые в наших продуктах — это, в основном, 16- и 32-битные микроконтроллеры Microchip, имеющие RAM от 8 до 32 кБ, и ROM от 128 до 512 кБ, без MMU. Иногда, для самых простых устройств, используются еще более скромные 8-битные чипы.

              Очевидно, что у нас нет (разумных) шансов использовать ядро Linux. Так что нам нужна какая-нибудь RTOS (Real-Time Operating System). Находятся даже люди, которые не используют никаких ОС в микроконтроллерах, но я не считаю это хорошей практикой: если железо позволяет мне использовать ОС, я ее использую.

              Несколько лет назад, когда мы переходили с 8-битников на более мощные 16-битные микроконтроллеры, мои коллеги, которые были гораздо более опытными, чем я, рекомендовали вытесняющюю RTOS TNKernel. Так что это — та ОС, которую я использовал в разных проектах в течение пары лет.

              Не то, чтобы я был очень доволен ею: например, в ней нет таймеров. И она не позволяет потоку ждать сообщения сразу из нескольких очередей. И в ней нет программного контроля переполнения стека (это действительно напрягало). Но она работала, так что я продолжал ее использовать.
              Читать дальше →
            • Return oriented programming. Собираем exploit по кусочкам

              • Tutorial
              Введение
              В этой статье мы попробуем разобраться как работает Return Oriented эксплоит. Тема, в принципе, так себе заезженная, и в инете валяется немало публикаций, но я постараюсь писать так, чтобы эта статья не была их простой компиляцией. По ходу нам придется разбираться с некоторыми системными особенностями Linux и архитектуры x86-64 (все нижеописанные эксперименты были проведены на Ubuntu 14.04). Основной целью будет эксплуатирование тривиальной уязвимости gets с помощью ROP (Return oriented programming).
              Читать дальше →
              • +37
              • 22,5k
              • 4
            • USB killer

                Было обычное хмурое зимнее утро, мы с коллегами по обыкновению пили утренний кофе, делились новостями, ничто не предвещало беды. Но тут приятель рассказал… далее цитата из скайп чата:

                Как-то читал статейку как парень в метро вытянул у чавака из сетчатого кармана сумки флеху, на которой 128 было написано. Пришел домой, вставил в ноут -> спалил пол компа… Написал на флехе 129 и теперь носит в наружном кармане своей сумки...

                Картинка для привлечения внимания:



                Так как я работаю на предприятии, которое занимается разработкой и производством электроники, то мы с коллегами принялись активно обсуждать варианты реализации такой флешки, — которая “спаливала бы полкомпа.” Было множество хардкорных, фантастических, а также вполне реальных вариантов. И всё бы так и закончилось этим весёлым обсуждением, если бы я не собирался заказывать изготовление печатных плат для других своих проектов.
                Читать дальше →
              • Лекции Технопарка. Программирование в управлении. История одного студента Бауманки

                  Сегодня мы продолжаем цикл публикаций лекций Технопарка (кстати, недавно проекту исполнилось 3 года). В этой лекции Кирилл Маркин, студент МГТУ им. Баумана, поделится своим опытом по созданию небольшой компании «Диафентис», которая занимается внедрением различных программных комплексов. Конспект лекции смотрите под катом.



                  Подписывайтесь на наш youtube-канал, там будет еще много интересного!
                  Читать дальше →
                  • +34
                  • 24,3k
                  • 8
                • Несколько интересных особенностей MySQL

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

                    Начнем с такого интересного типа, как ENUM.

                    mysql> CREATE TABLE enums(a ENUM('c', 'a', 'b'), b INT, KEY(a));
                    Query OK, 0 rows affected (0.36 sec)
                    
                    mysql> INSERT INTO enums VALUES('a', 1), ('b', 1), ('c', 1);
                    Query OK, 3 rows affected (0.05 sec)
                    Records: 3  Duplicates: 0  Warnings: 0
                    


                    Итак, у нас есть таблица, в ней есть два столбца. У первого, a, тип ENUM, у второго, b, INT. В таблице три строки, у всех трех значение b равно 1. Интересно, чему равны минимальный и максимальный элементы в столбце a?

                    mysql> SELECT MIN(a), MAX(a) FROM enums;
                    +--------+--------+
                    | MIN(a) | MAX(a) |
                    +--------+--------+
                    | c      | b      |
                    +--------+--------+
                    1 row in set (0.00 sec)
                    


                    Кажется странным, было бы разумно, если бы самым маленьким был 'a', а самым большим — 'c'.
                    А что если выбрать минимум и максимум только среди тех строк, где b = 1? То есть, среди всех строк?

                    mysql> SELECT MIN(a), MAX(a) FROM enums WHERE b = 1;
                    +--------+--------+
                    | MIN(a) | MAX(a) |
                    +--------+--------+
                    | a      | c      |
                    +--------+--------+
                    1 row in set (0.00 sec)
                    


                    Вот так мы заставили MySQL поменять свое мнение о том, как сравнивать поля в ENUM, просто добавив предикат.
                    Разгадка такого поведения заключается в том, что в первом случае MySQL использует индекс, а во втором нет. Это, конечно, не объясняет, почему MySQL сравнивает ENUMы по разному для сортировки в индексе, и при обычном сравнении.

                    Второй пример проще и лаконичнее:

                    mysql> (SELECT * FROM moo LIMIT 1) LIMIT 2;
                    +------+
                    | a    |
                    +------+
                    |    1 |
                    |    2 |
                    +------+
                    2 rows in set (0.00 sec)
                    


                    Когда я показал этот запрос своему коллеге, который занимается разработкой парсера SQL, его вопрос был не «почему этот запрос возвращает две строки», а «как надо написать SQL парсер так, чтобы такой запрос был валидным, без того, чтобы написать правило, специально разрешающее такой запрос».

                    Интересно, что далеко не любой SELECT в скобках сработает, в частности, UNION в скобках — это синтаксическая ошибка:

                    mysql> (SELECT * FROM moo UNION ALL SELECT * FROM hru) LIMIT 2;
                    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UNION ALL SELECT * FROM hru) LIMIT 2' at line 1
                    


                    Еще несколько интересных примеров под катом
                    Читать дальше →
                  • Я боюсь совершить ошибку

                      Каждый раз, задумывая что-то грандиозное, я испытываю страх. Он призывает мой мозг даже не начинать: «Это долго, это сложно, это невозможно». Когда я начинал делать свой проект, эти мысли посещали и меня. Кажется, я не один такой.

                      У меня есть приятель, с которым я знаком три года. Мы познакомились, когда я работал сценаристом компьютерных игр. Три года назад он хотел делать свою игру. Что изменилось с тех пор? Ничего. Он все так же хочет, но максимум что он сделал за это время — несколько раз запустил Unity.

                      Готовясь писать эту статью, я набрался храбрости и спросил его, что ему мешает начать. Он назвал множество причин — нет денег, нет времени, нет команды, нет ресурсов… Но в итоге, я все-таки вынудил его признаться, что это все отговорки. На самом деле — он боится.


                      Так почему же мы боимся?
                    • Почему люди звонят в Интернет

                        Для интернет бизнеса стоимость обращения клиента через корзину либо форму обратной связи — существенно дешевле чем контакт по телефону.
                        Специалисты работают над юзабилити сайта и корзины, все делается для того чтобы клиент нашел на сайте всю необходимую информацию, мог сделать заказ в несколько кликов, чтобы на пути к покупке не было ни единого барьера.
                        Сайты становятся все удобнее, а люди продолжают звонить.
                        Клиент заходит на сайт, видит цену товара или услуги, видит большую зеленую надпись «Есть в наличии», звонит и спрашивает «А есть в наличии? А какая цена ?».

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

                        Обобщая почти семилетний опыт работы в электронной коммерции, попробую ответить — почему так происходит и что с этим делать как с этим жить.
                        Читать дальше →
                      • NLP: проверка правописания — взгляд изнутри (часть 2)

                          (Часть 1) Сегодня мы поговорим об уровнях понимания текстов нашей системой, о том, какие ошибки правописания отловить просто, какие не очень просто, а какие запредельно сложно.

                          Начнём с того, что текст можно рассматривать с двух точек зрения: либо как простую последовательность слов, пробелов и знаков препинания, либо как сеть связанных между собой синтактико-семантическими зависимостями понятий. Скажем, в предложении «я люблю больших собак» можно расставить слова в любом порядке, при этом структура связей между словами будет одна и та же:

                          Читать дальше →
                        • Паранойя по поводу юридической безопасности или с чего начать защиту своего бизнеса

                            Успешные компании всегда привлекают к себе разного рода мошенников, взяточников и прочую нечисть. По собственной практике могу сказать, что в бизнесе действует принцип детской песочницы. В детстве все делились на тех, кто создает и тех, кто хочет прийти на все готовенькое. Вот построишь ты дворец из песка, а кто-то придет и обязательно или разрушит, или заберет. Бороться с этим бесполезно, как бесполезно бороться с животными инстинктами, которые в нас живут.
                            Читать дальше →
                          • Государь: алгоритм

                              «Государь» Макиавелли — одно из моих самых любимых произведений. Являясь руководством непосредственно правителю, я считаю, эту книгу обязан прочесть каждый начальник/директор. И хотя она уже устарела, думаю было бы весьма полезно держать ее советы у себя в голове.

                              Но бывает тяжеловато. Не только из-за объема информации, но еще и потому, что в зависимости от ситуации Макиавелли дает разные советы.

                              «Было бы неплохо структурировать», — подумал я.

                              Результатом мысли стал алгоритм принятия решения, представленный в картинке ниже и созданный исключительно по «Государю». Остальные советы, которые не определены ни под одну ситуацию и которые должны выполняться в любом случае, поданы ниже списком. Уверен, каждый сам сможет экстраполировать рекомендации правителю на должность руководителя.

                              Под катом картинка 1920x1573 px
                            • Стоит ли использовать русские буквы в написании ЧПУ — человекопонятных URL?

                                 

                                Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

                                Стоит ли использовать русские буквы в написании ЧПУ — человекопонятных URL?
                                • 22.2%www.example.ru/Детская_одежда (как в Википедии)516
                                • 50.3%www.example.ru/detskaya-odezhda (как рекомендует Google)1165
                                • 5.4%Использование любых ЧПУ является злом!127
                                • 21.8%I hate SEO peoples!506
                              • Канцерогенные излучения. Скандалы, интриги, расследования!

                                  На днях пришлось мне разослать по всей компании письмо. Думаю, что у каждого админа были, есть и будут на обслуживании идиоты, расставляющие кактусы вокруг монитора и одевающие «антикомпьютерные очки».
                                  Для таких индивидуумов и было написано письмо. Остальные просто посмеялись.

                                  Текст письма под катом.
                                  Читать дальше →
                                • Перспективы развития центральных процессоров

                                    Семьдесят лет назад, в 1941 году, был создан первый программируемый компьютер. С тех пор утекло немало воды, и сейчас компьютеры окружают нас повсюду. Многие аспекты устройства компьютеров сильно эволюционировали, многие, напротив, ничуть не изменились по сути. В частности, не изменился и, вероятно, никогда не изменится сам принцип работы центральных процессоров — алгоритмическая модель. Хорошо понятны физические ограничения этой модели, и соответственно, отчётливо виден предел развития центральных процессоров в смысле их быстродействия. Технологически до этого потолка ещё довольно далеко: несколько десятилетий развития и несколько порядков быстродействия. Но это не должно помешать нам всерьёз подумать, какими же будут процессоры на пороге предела их скоростного развития.
                                    Читать дальше →
                                  • Яндекс. Директ. Подпорки или как помочь глупому конкуренту слить бюджет

                                      image
                                      Итак, снова представим ситуацию.
                                      Мы производим какой-либо продукт (на этот раз — ядерные боеголовки:)) и продаем его с помощью Директа. Наша рекламная кампания работает давно и успешно, CTR устаканился на высокой отметке, стоимость за клик невелика, с Директа сыпятся заказы на наши боеголовки, деньги льются рекой, травка зеленеет и солнышко блестит.
                                      И вот в один прекрасный день вы получаете письмо от робота Директа о том, что кто-то вытеснил вас с насиженных позиций. Это наш старый негодяй-конкурент, компания «Бобруйские боеголовки» увидев как хорошо у нас идут дела, решает отвоевать часть рынка. Эта гордая миссия была поручена секретарше Люсе, так как «она умеет почту принимать и вообще шарит во всех этих компьютерах».
                                      Читать дальше →