• Что такое кластерный индекс в mysql?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Кластерный индекс... это на самом деле понятие крайне виртуальное.

    Что такое обычный некластерный индекс? берём выражение индекса, считаем его значение для каждой записи, сортируем и пишем на диск. Получаем отдельную структуру, в которой выражение индекса сортировано. Когда потребуется искать заданное значение этого выражения, мы вместо просмотра от записи к записи сразу половинным делением быстренько найдём нужное значение, возьмём из него уникальный идентификатор записи, и обратимся за записью. Если в таблице 1000 записей, то для поиска заданного значения без индекса нам в среднем пришлось бы просмотреть 500 записей, а с индексом - всего 10.

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

    В MySQL (точнее, в используемом по умолчанию движке InnoDB) первичный индекс, во-первых, существует ВСЕГДА, во-вторых, определяется так (в статье, на которую дали ссылку, имеются неточности в пункте 2):
    1. Если первичный ключ задан явно, то его выражение является также и выражением кластерного индекса. Или иначе - первичный ключ и есть кластерный индекс.
    2. Если первичный ключ явно не задан, но в таблице имеется индекс, отвечающий всем следующим требованиям:
      • является уникальным
      • не является функциональным, в т.ч. не использует в выражении вычисляемые поля
      • не использует в выражении поля, которые определены как допускающие значение NULL

      то именно такой индекс используется в качестве первичного. А если таких индексов несколько, то используется первый по тексту запроса на создание таблицы
    3. Если не имеется ни того, ни другого - генерируется синтетический скрытый 6-байтовый номер записи, который и используется как первичный ключ. Следует отметить, что штатных способов доступа к этому значению не существует.


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

    Фактически - именно так.

    Создаётся ли отдельная таблица или просто упорядочивается хранение существующих данных?

    Не создаётся. Но при изменении первичного индекса таблица полностью пересоздаётся с новым физическим порядком записей.

    Если данные упорядочиваются этим индексом, допустим по ID, то почему при select без сортировки данные могут возвращаться в произвольном порядке, а не отсортированные по ID по-умолчанию?

    Если не задан явно ORDER BY, сервер имеет право вернуть записи в любом порядке, как ему удобнее. В большинстве случаев, но не всегда, он будет возвращать записи в порядке чтения с диска...

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

    ===

    PS. Кстати, правило выбора индекса, который будет использоваться в качестве кластерного, имеет неприятный побочный эффект. Если у некоторых полей, входящих в какие-то индексы, изменяется свойство NULLability, то это может привести к изменению того, какой из имеющихся индексов станет использоваться в качестве первичного по пункту 2. В результате мы получим невозможность использования INSTANT / INPLACE методов, и будет использован длинный COPY. Впрочем, ситуация такая крайне редка.
    Ответ написан
    2 комментария
  • Запрос на уникальность в разные года. Как составить?

    rozhnev
    @rozhnev Куратор тега SQL
    Fullstack programmer, DBA, медленно, дорого
    NOT EXISTS эффективней чем NOT IN
    select distinct t.id_user from T as t
    where 
        t.year = 2023 and 
        not exists (select id_user from T tt where year = 2022 and tt.id_user = t.id_user);


    другие варианты решения задачи:
    -- LEFT JOIN
    select distinct t.id_user 
    from T as t
    left join T tt on tt.year = 2022 and tt.id_user = t.id_user
    where t.year = 2023 and tt.id_user is null;
    
    -- EXCEPT
    select distinct t.id_user from T as t
    where t.year = 2023
    except
    select distinct t.id_user from T as t
    where t.year = 2022
    ;
    Ответ написан
    Комментировать
  • Производительность труда. Как повысить?

    vabka
    @vabka
    Токсичный шарпист

    Низкая производительность труда. Могу целый день просидеть над задачей, которая как окажется можно было решить довольно быстро.

    Ну тут либо навыков не хватает, либо контекста. Спрашивай у более опытных коллег, что делать.

    Поставленные задачи я выполняю все, однако трачу на это много времени, хоть и теоретически я знаю как их выполнить.

    Попроси у тимлида и менеджера обратную связь по темпу. Если скажут, что ок, то не беспокойся.
    Если нет - тогда надо разбираться в причинах.

    Можно попробовать метод помидорки, про который тут уже упомянули, но он не со всеми срабатывает.
    На удалёнке действительно сложно сосредоточиться. Тут я могу только посоветовать:
    1. Завести отдельный акк на домашнем компе, специально для работы. Там не будет ни игр, ни сохранённых паролей для соцсетей.
    2. Телефон откинуть подальше и выключить уведомления.
    3. Прибраться в комнате, если это ещё не сделано. Убрать со стола вообще всё, что не нужно.
    4. Работать при хорошем освещении.
    Ответ написан
    Комментировать
  • Производительность труда. Как повысить?

    IonDen
    @IonDen
    JavaScript developer. IonDen.com
    Тут может быть дело в другом. Например слишком много отвлекающих факторов.
    Чтобы повысить продуктивность я рекомендую эту книгу: Организованный ум - Дэниел Левитин

    Еще есть так называемая Pomodoro Technique
    Ответ написан
    2 комментария
  • Кто знает хорошие уроки про PHP,MVC?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Ответ написан
    Комментировать
  • Ноутбук под Linux. Какой выбрать?

    @AVKor
    Размер экрана как можно больше, разрешение должно быть адекватное, иначе глаза сломаются читать мелкий текст. Матрица - матовая (иначе будут блики). Оперативки как можно больше.

    Потенциального кандидата пробивать в Гугле [название модели] + Linux, чтобы не нарваться на проблемное железо.
    Ответ написан
    4 комментария
  • Mysql как удалить по ключевому слову?

    Alexandre888
    @Alexandre888
    Javascript-разработчик
    DELETE FROM wp_posts WHERE post_title LIKE 'Order%'
    Ответ написан
    1 комментарий
  • Как правильно отрефакторить кусок кода?

    @P747
    1. Можно сделать автозагрузчик на основе PSR-4: https://tyapk.ru/blog/post/php-autoload
    2. Нужно соблюдать PSR-12 https://www.php-fig.org/psr/psr-12/
    3. Всегда документировать код (методы, класс и т.д.), так же использовать PHPDoc https://elisdn.ru/blog/80/some-reasons-to-learn-phpdoc
    4. Купите PhpStorm, нажимаете CTRL+ALT+L(сам делает разметку правильной), плюс дополнительные плагины для соблюдения правильности написания кода
    Ответ написан
    Комментировать
  • Как в yii2 поменять форматирование суммы в asCurrency?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    В документации честно не нашел)

    Плохо искали.
    Yii::$app->formatter->asCurrency('10650000', 'RUB', [NumberFormatter::FRACTION_DIGITS => 0])

    Должно быть установлен php-intl
    Подробней.
    Ответ написан
    Комментировать
  • $_GET параметры недоступны в компоненте Yii2?

    proudmore
    @proudmore
    Скорее всего проблема в том, что bootstrap секция вызывается раньше инициализации объекта yii\web\Request
    Ответ написан
    1 комментарий
  • Как избавиться от этого бага?

    hzzzzl
    @hzzzzl
    округлять
    https://0.30000000000000004.com/

    (0.30000000000000004).toFixed(1)
    Ответ написан
    Комментировать
  • Верна ли такая реализация?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Выносить из контроллера - правильная вещь. Но не правильно что вы туда затащили всю логику. Флешь сообщения. Обработка формы. Можете посмотреть пример как это делается.

    Пример 1
    Пример 2
    Ответ написан
    3 комментария
  • Что почитать/посмотреть для изучения паттернов, желательно с реализацией на php?

    @JeKaAa
    Тепляков С. - Паттерны проектирования на платформе .NET
    Очень крутая сразу с примерами. .NET там ни при чем. Плюс автор в конце книги по SOLID'у пробегается очень неплохо.
    Ответ написан
    Комментировать
  • Что почитать/посмотреть для изучения паттернов, желательно с реализацией на php?

    Compolomus
    @Compolomus Куратор тега PHP
    Комполом-быдлокодер
    https://refactoring.guru/ru
    Не все, но многие
    Ответ написан
    Комментировать
  • Паттерн Фабрика или Фасад?

    Zifix
    @Zifix
    Barbatum
    В данном случае, вы запутались в паттернах, потому что на самом деле они вам и не нужны. Просто сделайте, как считаете нужным, без переусложнения. Если окажется, что работать с получившейся обвязкой неудобно — отрефакторите.

    Как два программиста хлеб пекли +

    Вот тут в комментах товарищ отлично излагает:

    Как я уже говорил, чтобы оценить архитектуру нужно иметь базовые навыки ее создания, а у тебя их нету. Поэтому ты даже не понимаешь того, о чем это книга. Что такое паттерны программирования, и какую проблему они пытались решить, но не решили.

    Паттерны это сборник примеров того, как можно сделать. Не образец для подражания, не набор готовых блоков.

    Если обратиться к реальной архитектуре, в смысле домов, то мы увидим что из готовых блоков можно построить хрущевку, в 3 этажа или в 5, в 5 подъездов или в 10. Но ничего кроме хрущевки нельзя. Ни мост, ни любое другое нормальное здание. Только тупую панельку.

    Вот тоже и с паттернами. Паттерны не подменяют и не заменяют умение проектировать. Да, они задумывались для этого, но эта попытка провалилась. Даже если ты из лего замок строишь, нужно понимать что ты делаешь, а не бездумно блоки совать.
    Ответ написан
    2 комментария
  • Как в зависимости от ответа сервера изменить иконку c помощью ajax?

    slo_nik
    @slo_nik Куратор тега Yii
    Добрый вечер.
    Вот Вам упрощённый способ на примере смена статуса. В колонке таблицы всё те же span.
    // GirdView column
    [
        'attribute' => 'status',
        'contentOptions' => function($model, $key, $index, $column){
             return [
                 'class' => 'status-column',
                 'style' => 'cursor:pointer',
                 'id' => $key,
                 'onclick' => '
                        $.ajax({
                           url: "' . Url::toRoute('/ajax/update-status-mark') . '",
                           method: "POST",
                           data: {id: ' . $key . ', status: ' . $model->status . '},
                           success: function(data){
                              if(data == 0){
                                 $("td#' . $key . ' span").removeClass("label-success").addClass("label label-danger").text("Blocked")
                                 $("tr[data-key=' . $key . ']").removeAttr("style")
                              }
                              else{
                                 $("td#' . $key . ' span").removeClass("label-danger").addClass("label label-success").text("Active")
                                 $("tr[data-key=' . $key . ']").css("backgroundColor","rgb(226, 243, 227)")
                              }
                           }
                        })
                    '
             ];
         },
    ]
    
    // Controller action
    public function actionUpdateStatusMark($id)
    {
        $model = $this->findModel($id);
        $model->status = $model->status == 0 ? 1 : 0;
        $model->save(false,['status']);
        return $model->status;
    }
    Ответ написан
    3 комментария