Задать вопрос
  • Как правильно работать с большим количеством данных?

    @rPman
    Избавляйся от ... where fld like '%...%' это самые плохие по скорости запросы, хотя не всегда это возможно без увеличения размера базы, вообще полнотекстовый поиск можно отдавать на откуп стороннему приложению (это может расширить возможности фильтрации), считай это еще одной формой индекса, хотя лучше данные по другому хранить. Я встречал ситуации когда в varchar хранили значения справочника из десятка значений, но делали по нему like %% что грузило базу прилично, когда как сделать простой комбобокс на порядок эффективнее и удобнее - поиск по подстроке лучше по справочнику делать на клиенте.

    Без индексов скорее всего никуда, если в запросе идет фильтрация по полю, то если не создать на него индекс, этот запрос и будет создавать нагрузку

    В некоторых специфических случаях, можно делать запросы заранее (для более шустрой пагинации например), запрашивая сразу несколько страниц наперед, с учетом движения вперед (и возможно назад, в общем прогноз должен предполагать что перелистывание продолжится), запрос на будущие записи делать заранее, пока пользователь смотрит текущий результат. Недостаток подхода - при удачном прогнозе действий пользователя отзывчивость интерфейса повышается, как и средняя нагрузка на базу. Так же добавляет отзывчивости если окно запроса будет больше окна отображения (т.е. для отображения 10 строк запрашиваешь 30, начиная с предыдущей страницы)

    Частный случай прогноза, не делать select ... limit ... на каждую страницу, а при смене фильтра запрашивать весь диапазон, но только идентификаторы, сохранив их либо в таблице на сервере либо на бакэенде, генерирующим запросы вида select ... id in (...), последнее если количество записей не больше тысяч. Кстати именно постраничная навигация с прогруженным списком id самая шустрая

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

    Некоторые фильтрации данных возможно эффективнее делать на клиенте, как бы это странно не звучало, но клиент по скорости работы может даже превосходить сервер, так почему бы часть данных не хранить в принципе на нем и не фильтровать там же, но это зависит от особенности данных, гонять и хранить гигабайты клиенту не удобно (особенно если это браузер). Это может сильно усложнить алгоритм пагинации, но подумай, так ли человеку нужно знать какой номер строки у него сейчас, обычно достаточно понимать общий прогресс (сколько примерно до конца списка и сколько данных в принципе).

    p.s. диск на сервере hdd или ssd? если не хватает денег на большой ssd, настрой маленький ssd как кеш к медленному hdd (linux bcache), даже когда данные полностью не влезают в кеш, это дает заметный прирост, потому что hdd начинает менее случайно двигаться, плюс добавляется буферизация записи (данные записываются на ssd и лежат там пока hdd не освободится), так же дает эффект ускорения записи вынос журнала файловой системы (если ext4) на ssd (требуется пара гигабайт от силы).

    Осторожно, если высокие требования к надежности хранения, кеширующий ssd в режиме записи лучше пусть будет хотя бы raid1, так как иначе при смерти ssd починить данные, размазанные по диску и кешу будет очень сложно. Для кеша только для чтения это не так критично (при смерти ssd сервер просто упадет, не убивая данные).

    Но мне больше нравится резервирование на лету (настроить онлайн репликацию, пусть и на слабый, бакап сервер)
    Ответ написан
    1 комментарий
  • Как прочитать вторую строку .txt файла?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    <?php
    $fileObject = new \SplFileObject('file.txt');
    $fileObject->seek(1); //пропускаем одну (первую) строчку
    $line = $fileObject->current();
    Ответ написан
  • Как адаптировать код php под FreeBSD?

    Вместо использования команды можно создавать файл и перед запуском скрипта проверять, создан ли он

    if (file_exists('myscript.running')) {
       echo 'Скрипт уже работает!', PHP_EOL;
       return;
    }
    touch('myscript.running');
    
    // Тут ваш код
    Ответ написан
    3 комментария
  • Как сгенерировать код P-XXXXXXXX, где X - числа [PHP]?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    function generator($litera) {
        return mb_strtoupper($litera)."-".random_int(10000000, 99999999);
    }


    for($i = 1; $i <= 5; $i++) {
        $code = generator("P");
        echo $code."\n";
    }
    
    //P-10762100
    //P-85344418
    //P-57088151
    //P-14499009
    //P-24729321
    Ответ написан
    1 комментарий
  • Что делать с кучей HDD?

    @rPman
    Набиваешь компьютер контроллерами, расширяющими количество sata (ide и другие, какие у тебя диски), можно несколько компьютеров, и физически подключаешь диски.

    Осторожно, разные способы подключения могут задавать разные ограничения. Например USB контроллеры ограничивают совокупную скорость подключенных к ним дискам (обычно правда только один диск можно) - usb2 до 30мбайт/сек, usb3 примерно сравнимо с sata (5гбит/сек это), pci дают не больше 100мбайт/сек (133 кажется), pci-e 8 максимум выдаст 8гбит/с.
    Т.е. к примеру не пытайся к одной старой pci подключить 5 дисков, совокупная их скорость не превысит 100мбайт, что нормально для одного диска но фатально для массива.

    Теперь второе, протестируй каждый диск на линейную и не только скорость, как в начале так и в конце, плюс собери статистику (например старые диски с большим количеством перемапленых бэд секторов могут давать нормальную скорость в одном месте но плохую в другом), каждому диску пропиши скорость в наихудшем.

    Третье, собирай софтварные рейды из дисков с приблизительно равными скоростями в худшем, и тем более не все в один огромный, это бессмысленнно, но примерно два года у меня проработал конфиг (потом разобрал так как купил норм диски) из старых дисков разного размера где был собран двухуровневый каскадный рейд, где из двух дисков был собран raid0 с чередованием (это ускоряет итоговый результат без резервирования) а затем с использованием этого логического тома и трех других собран raid5, при этом размеры всех дисков были разные, и были использованы специально созданные тома на тех дисках что больше, из остатков собрал raid0 (точнее тот что предлагает btrfs это просто объединение разделов в один, последовательным присоединением) но из-за ненадежности этот хвостовой так для хранения не использовался.

    С помощью linux nbd или iscsi утилита istgt (или aoe если есть возможность выделить отдельный сетевой кабель на каждый логический диск) или даже drbd можно объединить диски с разных физический компьютеров.

    Важно, не используй аппаратные рейды - это вендорлок, к тому же дешевые встроенные в материнку не дают никакого бонуса, а дорогие тут наверное бессмысленны.

    Вместо dmraid можно использовать фичи btrfs или zfs, где функции рейда встроены в файловую систему (осторожно btrfs raid5/6 заявлены как нестабильные, я не знал, пользовался несколько лет, вроде проблем нет, даже когда менял сбойный диск, но это конечно не аргумент)

    Не стоит создавать один огромный массив, мало того, даже в пределах большого диска я создаю несколько маленьких (хотя конечно это уже от твоих задач должно исходить), так как обслуживать маленькие заметно удобнее, к примеру изменение класса raid (raid1 -> raid5) или добавление диска raid5 и переконфигурирование можно делать поэтапно, плюс raid rebuild обычно медленней пересозадания (т.е. бакапишь данные с маленького, пересоздаешь с другой конфигурацией, тем более к примеру когда сначала у тебя были 3тб диски а потом станешь докупать 4..6тб, достаточно использовать терабайтовые куски чтобы горя не знать...

    Можно пользоваться lvm или все отдать на откуп btrfs, уже твое усмотрение. Я лучше буду работать с несколькими независимыми точками монтирования, разруливая при необходимости симлинками.
    Ответ написан
    2 комментария
  • Какую технологию выбрать для работы с базой данных?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Конкретный ответ на ваш вопрос в данной формулировке дать нельзя. Многое зависит от структуры БД, от сценариев работы с ней, интенсивности запросов, соотношения запросов на чтение к запросам на запись и т.д. и т.п. Вероятнее всего, это вопрос не к СУБД, а к архитектуре вашего приложения. В целом, у меня в одном из проектов запросы на чтение по индексу из таблицы с 23 миллиардами записей укладывались в десятки миллисекунд при стандартных настройках и не особо мощном сервере.
    Ответ написан
    1 комментарий
  • Извлечь имя из текста на php возможно?

    @Flying
    Сильно зависит от реальной задачи, которая в вопросе не указана.

    Одно дело если ваш текст имеет определённый формат и вы знаете что имя в тексте точно есть и где его искать. Или вы знаете что имена могут быть не произвольными, а строго из какого-то списка. В этом случае вам, естественно, могут помочь регулярки, поиск по словарю и т.п.

    Если же речь идёт о произвольном тексте - то здесь всё сильно интереснее. Ведь имён очень много, они могут иметь разные формы (полное / краткое имя), падежи (Саша, Саше, Сашу, Сашей и т.п.), могут быть написаны с ошибками, опечатками, неоднозначностями написания (Артем / Артём), транслитом и т.п.

    Здесь я бы рекомендовал в первую очередь обращаться к специализированным сервисам. Если речь идёт о русском языке - в голову первым делом приходит, конечно же, dadata.ru и их API по стандартизации имён. Да, это стоит каких-то денег, но работает очень хорошо, могу сказать по своему опыту.
    Ответ написан
    9 комментариев
  • Как работать с большим количеством запросов?

    Использовать транзакцию и выполнять блокировку строки таблицы на запись перед увеличением значения
    Ответ написан
    2 комментария
  • Как исправить ошибку ACPI при загрузке Kubuntu 18.04?

    @rPman
    Обновления не ставил
    на сколько я помню обновления безопасности все равно включены, иначе просто непонятно, откуда проблема.

    Нужно включить логи ядра и initramfs, для этого в загрузчике grub нужно нажать F4, найти строчку с параметрами ядра vmlinuz и убрать quiet, и нажать ESC для загрузки. Последние строчки лога могут многое сказать.

    У меня похожая ситуация случалась, дважды, система не загружалась, не видела дисков... поковырявшись я предположил что последовательное обновление без перезагрузки (до полугода аптайм бывает) что то сломало в initramfs и какие то нужные модули не грузились, один раз удалось спасти ситуацию, подменив vmlinuz и initramfs взяв их из livecd той же версии (получается старой) это не паноцея, считай почти как рекавери, так как не будут работать к примеру проприетарные драйвера или другие модули типа virtualbox или kvm но можно будет поковырять из рабочей системы или сделать резервную копию баз данных и файлов. К сожалению когда это произошло второй раз, копирование с livecd не помогло, не было времени тогда разбираться, переустановил систему.

    Если livecd так же не загружается, то похоже уже аппаратная проблема. В биосе можно отключить ACPI, точнее поиграться с настройками что то отключить, что то перевести в другой режим (например отключится нормальный режим сна)
    Ответ написан
    Комментировать
  • Почему программисты не пользуются конструкторами сайтов (Nicepage например)?

    approximate_solution
    @approximate_solution
    JS Developer. Angular\React\Vue\Ember
    Почему программисты не пользуются конструкторами сайтов

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

    Молоток в примере выше:
    Есть бизнес, условное 8 марта, где нужно создать посадочную страницу(лендинг) и продавать цветы через 2 дня. Если писать руками весь проект с нуля - есть шанс что вы ничего не заработаете(не берем в рассчет локальный бизнес и сарафанное радио). Выход: вы берете конструктор, быстро накидываете дизайн и выводите прототип в продакш. Далее подключаете контекстную рекламу гугла и яндекса = профит.

    Ложка в примере выше:
    Есть бизнес: бизнес больше ИП. Масштабируемый, со сложной логикой, где требуется быстрый сайт, быстрый отлик, переиспользуемость компонентов, адекватное SEO, проект который будет поддерживаться ближайшие n-лет, где штат разработчиков больше одного человека, и присутствует четкое разделение на фронтенд и бэкэнд.

    Подойдет ли для такого конструктор? На 99% что нет, здесь вы уже используете шаблонизаторы, языки программирования, паттерны и сложную архитектуру. Которая при должном уровне разработке даст вашему бизнесу и вашим клиентам - отличный продукт, приложение или сайт.

    Плюсы конструктора:
    Быстро,
    Не качественно, но дешево,
    Минусы:
    Не поддерживаемый код,
    отсутствие масштабируемости как таковой,
    Бизнес выше среднего - лесом.
    Ответ написан
    Комментировать
  • Как решить проблему?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    У UPDATE другой синтаксис

    UPDATE table SET column_1 = new_value_1 WHERE search_condition
    Ответ написан
    Комментировать
  • Как перебрать элементы первого массива на вхождение во втором массиве на php?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    <?php
    $arr1 = [
        'BBBBB',
        'AAAAAA',
        'YYYYY',
    ]; 
    
    $arr2 = ['result' => [
        ['ID' => 712, 'PROPERTY_112' => ['value' => 'AAAAAA']],
        ['ID' => 713, 'PROPERTY_112' => ['value' => 'BBBBBB']],
        ['ID' => 714, 'PROPERTY_112' => ['value' => 'CCCCCC']],
    ]];
    
    $values = array_column(array_column($arr2['result'], 'PROPERTY_112'), 'value');
    
    $intersections = array_intersect($arr1, $values);
    
    echo empty($intersections) ? 
        'Совпадений не найдено' : 
        'В массиве $arr2 найдены совпадения из списка $arr1: '.join(',', $intersections)
    ;
    Ответ написан
    Комментировать
  • Как перебрать элементы первого массива на вхождение во втором массиве на php?

    0xD34F
    @0xD34F
    array_intersect($arr, array_map(fn($n) => $n['PROPERTY_112']['value'], $result))
    Ответ написан
    Комментировать
  • Можно ли хранить все подряд на ssd диске C?

    Jump
    @Jump Куратор тега Windows
    Системный администратор со стажем.
    Можно ли хранить все подряд на ssd диске C?
    Можно.

    Стоит ли выделить из него раздел под D где-то 140гб?
    Это уж вам решать.
    Лично мне непонятно каким образом вам хватит оставшегося под системный диск, но дело ваше.

    Или дележка была актуальна для HDD дисков?
    Дележка была и будет актуальна для удобства пользователя! Поэтому смотрите на пользователя, а на тип диска внимания не обращайте.
    Ответ написан
  • Есть ли сервисы для сохранения файлов для сайта?

    @unseriously
    Сервис для хранения файлов - Amazon S3 Bucket. Но с бесплатностью у него так себе.
    А вообще, бесплатный сыр он жеж такой товарищ...
    Ответ написан
    Комментировать
  • Как с помощью регулярки php выбрать первые N строк из текста?

    0xD34F
    @0xD34F
    Регулярные выражения не нужны:

    implode("\n", array_slice(explode("\n", $text), 0, количество_строк))

    Но если очень надо, то:

    preg_match('~([^\n]+(\n|$)){0,количество_строк}~', $text, $match)
    Ответ написан
    Комментировать
  • В чем моя ошибка в запросе?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Ошибка потому, что ваш вызов $conn->query(...) транслируется в mysqli::query($conn, ...), а эта функция ждёт ровно два параметра. Первый - соединение, второй - текст запроса.
    Для использования подготовленного запроса, его необходимо сначала подготовить (prepare), затем связать плейсхолдеры с переменными (bind_param) и только после этого выполнить (execute).
    Ну и апострофы у вас неправильные, имена баз данных, таблиц, и полей берутся в обратные апострофы (`).
    Ответ написан
    3 комментария
  • Почему при копировании в инпут буквы "ё" появляются проблемы у strtr?

    @rPman
    проверяй кодировку, причем она должна совпадать как в заголовках http, так и на странице и в коде.

    совет, для utf8 используй mb_... аналоги функций, куча странных проблем уйдет
    Ответ написан
    Комментировать
  • Можно ли менять сортировку данных без запросов к БД?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    3 комментария