Задать вопрос
  • Как выполнить запрос с условием?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    В запросе этой таблицы нет. Парсер не знает, к чему вы пытаетесь обратиться по имени personality.
    Ответ написан
    Комментировать
  • Как понять кодировку, при скачивании через wget?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Какого-то эфемерного "настоящего" имени файла ни в одном из этих вариантов нет. Файла может вообще не существовать.

    все равно потом имя файла будет изменено

    Ну и нафиг вам вообще это имя сдалось? Сохраняйте сразу с тем именем, по которому сможете файл найти, опция output-document
    А то и сразу курлом из php и загружать.
    Ответ написан
  • Возможно увеличить скорость соединения используя несколько сетевых плат?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Channel bonding, EtherChannel, link aggregation, LACP 802.3ad. Разные названия, а суть одна. Есть разные схемы работы, грабли и поддержка железом.
    Лучше LACP, но его должен уметь коммутатор.
    Ответ написан
    Комментировать
  • Как получить тело POST запроса?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    В смысле с заголовками?
    Тело POST-запроса - это именно php://input
    Что отправили, то тут и получите.
    Ответ написан
    3 комментария
  • Как решить проблему с кодировками UTF-8 без BOM и просто utf-8?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Вот этот странный колхоз - это вы кастрированный iconv в cp1251 сделать пытаетесь? Вроде по поведению похоже.

    Страница вывода ленты у меня в UTF-8.

    И simplexml всегда в UTF8. Что вы тут пытаетесь сделать с бедным юникодом я не очень понимаю.
    Ответ написан
    1 комментарий
  • Как оптимизировать базу данных?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    1. Поле типа varchar всегда занимает минимум 1 или 2 байта на диске, в зависимости от максимальной длины этого поля. В индексах и при операциях в памяти разворачивается до своего максимального размера (подобно char). Больше данных -> меньше данных влезает в кеш -> больше нагрузка на диски -> медленнее работа.
    На таком смешном размере таблицы не имеет никакой роли. Если это уже потребовалось оптимизировать - огромные грабли в другом месте.
    2. Да, на диске varchar хранит только то, что положили в поле. Плюс 1 или 2 байта оверхеда на хранению длины записанной строки.
    Ответ написан
    Комментировать
  • Оптимизация группировки SQL запроса?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Смотрите в сторону полнотекстового поиска. Начните со штатного в mysql. Если не поможет - используйте сторонний поиск: elastic search, sphinx

    like %что-то% тормозить будет всегда.
    Ответ написан
    1 комментарий
  • Как оптимизировать скорость запроса с использованием индексов MySQL?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Нет, отдельный индекс по id_product использоваться не будет. Зачем брать индекс, находить значения по нему и затем искать их по первичному ключу (в innodb кластеризация по первичному ключу же), если можно искать сразу по первичному ключу?
    Вот если бы первичный индекс был id_shop & id_product - тогда да, индекс по id_product был бы полезен.
    Ответ написан
  • Как сделать сложный UPDATE запрос к MySQL для частичного слияния данных двух таблиц?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    update table2 
    join table1 using(user_id)
     set table2.unicnumber = table1.unicnumber 
    where table1.accept = 1

    ?
    Ответ написан
    Комментировать
  • Как правильно использовать View в PostgreSQL?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Есть View. Планировщику придёт что-то похожее на изначальный запрос и дальше он будет переписывать запрос. Т.е. что-то подобное пункту 1.

    Есть Materialized Views. Это пункт 2. www.postgresql.org/docs/9.4/static/rules-materiali...
    Ответ написан
  • Оптимизация скрипта или переход на другой язык?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Чем, по вашему мнению, вам поможет переход на другой язык, если примерно 99% времени вы находитесь в ожидании сетевой операции?

    В простом случае используйте curl_multi.
    Ответ написан
    1 комментарий
  • Есть ли решение для пагинации древовидных комментариев?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Начните с изучения вопроса, как можно хранить деревья в РСУБД.
    Для ограниченного количества вложенности - материализованной путь отлично подходит. И элементарно выводится limit'ом, можно даже без offset'а обойтись, если озадачиться.
    Ответ написан
    Комментировать
  • Почему процессоры старого поколения продаются дороже чем более современные?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Потому что так решил производитель. Сейчас они оба End of Life. Т.е. производитель вместо снижения отпускных цен просто снял модель с производства.
    Магазины же себе в убыток торговать не любят. По чём купили - за столько (+наценка) и будут продавать. Поищите какой-нибудь Core 2 Quad Q6600. Как вам десятилетний ветеран за 7 тыс?

    А на моменты своих рождений - это были продукты в принципе разных классов. Многосокетные конфигурации традиционно дороже. Плюс, сравните объём поддерживаемой памяти. Потому кардинально разные отпускные цены.
    Ответ написан
    2 комментария
  • Rак правильно организовать списание баланса?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    InnoDB все запросы выполняет только в транзакции. Если открытой транзакции не было, то этот запрос неявно оборачивается в транзакцию.
    Вот только сами по себе транзакции не помогут, надо ещё правильно ими пользоваться. Тут я бы хотел дополнительно обратить внимание Андрей:
    Попробуйте в двух терминалах написать:
    сначала begin; в обоих
    потом select из таблички. Значения одинаковые, правда?
    потом update этой же таблички, сделайте set fieldname = разные значения в терминалах. Второй терминал запрос принял, но не вернул управление, верно?
    потом commit; в первом терминале. update из второго терминала сразу же ответил OK.
    Теперь сделайте commit во втором терминале и посмотрите, что произошло с данными. Это то, на что вы рассчитывали? Или всё-таки не совсем?

    N пользователей запрашивают услугу одновременно, корректно ли произойдет списание средств?

    Нет, некорректно, если только вы не в одной транзакции и не читаете баланс специально с select .. for update.
    Потому что для выполнения действия $this->balance -= $sum; у вас уже должен быть известен баланс, но это ещё не операция записи.
    В итоге у вас было 1000 рублей.
    Пришёл один клиент, прочитал баланс, хочет списать 200 рублей. Обновил циферку в PHP, никто ему не мешает.
    Пришёл второй клиент, прочитал баланс, хочет списать 100 рублей. Обновил циферку в PHP, никто ему тоже не мешает.
    И на шаге save оба отправили запросы на update: один клиент считает, что на балансе осталось 800 рублей, второй - что 900.
    Сколько запишется на баланс? 800 или 900, как повезёт. Правильно ли это? Сколько должно было быть? 700 ведь.
    Потому что клиенты не мешали друг другу обновлять циферку в PHP.

    Как же заставить клиентов не делать глупости?
    В простом случае:
    update tablename set balance = balance - :amount where balance >= :amount and user_id=:uid
    И на приложении проверять affected_rows. Если строка изменена - у пользователя достаточно денег, платёж прошёл. Если изменённых строк нет - вероятно, у пользователя нет столько денег. СУБД разберётся с очерёдностью исполнения и в результате на балансе будет правильная сумма, сколько бы параллельных запросов ни пришло. И, что не менее важно - приложение ответит на все запросы корректно, кому денег хватило, а кому - уже нет.

    В более сложных случаях - можно самому попросить СУБД взять блокировку на строку, о чём чуть ранее я уже заикался:
    begin;
    select balance from tablename where user_id=:uid for update; -- все параллельные транзакции будут выстраиваться в очередь здесь
    /* произвольные запросы (в mysql кроме вызова хранимок, DDL - они делают неявный коммит). Среди этих запросов - обновляете баланс */
    commit; -- только здесь эта транзакция освобождает блокировку select .. for update и с этой строкой начинает работать следующий запрос

    Как вообще работать с деньгами и делать это правильно - Кирилл даёт правильное направление. Изучите, как это делает бухгалтерия, за многие десятилетия работы они придумали, как обходить много странных граблей.
    Ответ написан
    2 комментария
  • Как эффективно организовать таблицу для 250 000 записей?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Если вам действительно, в реальности, зачем-то нужно делать where value = "4 миллиона знаков", то сделайте hash-индекс.
    Mysql их не умеет, так что велосипедим рядом ещё одним полем, в которое пишете результат хэш-функции от этого самого текста. И индексируем обычным btree. Например, md5 или даже просто crc32
    В запросе, соответственно, where hash = посчитанный хэш and value = "4 миллиона знаков"
    Ответ написан
    2 комментария
  • У Таймвеба слетела линковка сайтов, можно ли это сделать средствами сторонних DNS-серверов?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Если их DNS отдают не тот IP, который нужен - то смена DNS на сторонние поможет. При этом вы должны знать, на какой IP всё-таки надо отправлять запросы. Проверяется просто: добавьте временно в hosts статическую запись на свой домен и требуемый IP. Если проблема устранилась - перетаскивание DNS поможет.
    Если ошибка в конфигурации именно веб-сервера - не поможет. Ну разве только вы сразу переедете к другому хостеру.
    Ответ написан
    Комментировать
  • Будет ли смысл от програмного RAID0 через USB2.0?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    стримить по веб

    А ваша малинка вообще может утилизировать сеть?
    Чтобы хотя бы заикаться о производительности диска.
    Ответ написан
    3 комментария
  • Как найти цифру через LIKE?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Приведите в нормальную форму. Сразу гора костылей пропадёт.
    Ответ написан
  • Как сравнить 2 таблицы и вывести id который нет во второй талице?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    insert into test2 (test_id, type)
    select test.id, type_value from test1 
    join (
    select 1 as type_value
    union all
    select 2
    ) as types ON TRUE -- нужно декартово произведение
    where not exists (select 1 from test2 where test2.test_id = test.id)


    Если mysql древний, то, возможно, эффективнее будет test left join test2 on test2.test_id = test.id where test2.test_id is null
    Ответ написан
    3 комментария