• 52 вопроса, которые вы должны задать на собеседовании

      Вы, наверное, уже знаете, что интервью — это не просто очередной этап при устройстве на работу, это также ваша возможность разобраться, подходит ли вам эта работа. Для этого важно задать некоторые вопросы. Что вы хотите знать об этой должности? О компании? О подразделении? О команде? О корпоративной культуре?



      Задавать вопросы бывает сложно. Мы это знаем. Для того, чтобы упростить вам это задание, мы приводим список ключевых вопросов для интервью. Мы определённо не рекомендуем задавать их все. Пожалейте рекрутера!
      Читать дальше →
    • Несколько интересных особенностей 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
        


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