Задать вопрос
  • Есть ли решение для пагинации древовидных комментариев?

    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 комментария
  • Какие есть бесплатные утилиты для бэкапа баз MySQL на локальный компьютер?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Раз уж в вопросе не написано, чем он вам не подходит, то начните со штатного mysqldump
    Ответ написан
    1 комментарий
  • Можно ли контролировать нагрузку на процессор?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Во-первых, переезжайте на нормальный VPS. Зачем вам хостер, который не предоставляет вам обещанных ресурсов?
    VPS хостер должен предоставлять все ресурсы, которые пообещал.

    1) посмотрите в cgroup
    2) так тоже можно. Но зачем?
    3) какое-то узкое место есть всегда. Если есть полная утилизация CPU - значит в него и упёрлись. Если CPU утилизируется не полностью - значит упёрлись во что-то другое. В ввод-вывод (диск, сеть), память или ещё во что-нибудь. Распаковка довольно простого zip'а - скорей всего в диск упёрлась.
    Ответ написан
    Комментировать
  • Как импортировать DB MySQL 3.23 InnoDB в DB MySQL 5.1 InnoDB?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Задампить
    Посмотреть глазами синтаксис. На память - в те исторические времена был type=(storage_engine) вместо engine=(storage_engine) в create table
    Попытаться записать
    Разбираться с возникающими ошибками.
    Profit
    Ответ написан
    Комментировать
  • Вопросы по PDO php?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    1) dev.mysql.com/doc/refman/5.7/en/show-profile.html
    2) between пишется так: dev.mysql.com/doc/refman/5.7/en/comparison-operato...
    Сравните со своим.
    3) php.net/manual/en/pdostatement.bindparam.php , $data_type = PDO::PARAM_STR. Ещё что-то пояснять равзе надо?
    Ответ написан
  • Почему в коде ошибка (код внутри)?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Проверьте версию PHP. Вы пользуетесь какой-то слишком музейной, нужна минимум музейная 5.4, лучше использовать актуальную 5.6
    Ответ написан
    Комментировать
  • Почему не добавляется внешний ключ?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Определения полей должны совпадать.
    int и unsigned int - разные типы полей.

    Ну и, конечно, таковая строка должна существовать.
    Ответ написан
    2 комментария
  • Как заставить COUNT(*) вернуть ноль?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    А зачем вы группируете по полю, если заранее известно, что разных значений там будет ровно одно?

    SELECT COUNT(*)
    FROM rooms
    WHERE roomtype = 'люкс' AND dirty = 'Y'
    Ответ написан
    1 комментарий
  • В чём проблема (file_get_contents)?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Здравая мысль от Алексей Уколов продублировать комментарий из обсуждения как полновесный ответ.

    var_dump($info) автору отобразил string(4) "0"
    Здесь особое внимание не на выводимый "0", а на цифру в скобках, которая говорит, что в этой строке 4 байта. Не один, как было бы в большинстве кодировок для строки "0".
    Самое очевидное - в ответе сервера прилетает BOM-метка. Как раз 3 байта BOM, затем байт символа 0, вот и 4 байта в ответе. Но может быть что-то и другое - посмотрите hexdump'ом ответ сервера. (как вариант, запишите ответ в файл и посмотрите этот файл hexdump'ом).
    Ответ написан
    Комментировать
  • Подойдет ли оперативка?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Брать можно любые, укладывающиеся в стандарт. Список совместимости - это конечно хорошо, но даже на актуальные платформы он очень уж короткий. Но брать под манибек. Редко, но бывает, что исправные по отдельности плата и память вместе не работают.

    С разной частотой и таймингами в общем случае ставить можно, но работать вся память будет с характеристиками худшего модуля из установленных. Если не заработали - манибек опять же пригодится.
    И почему 10? 12гб должно получиться в итоге.

    Касательно конкретно DDR3 - обращайте внимание на напряжение питания. Вам лучше брать со стандартными 1,5V. Встречаются в рознице с напряжением выше - это или очень старые запасы начала эпохи DDR3 или современные оверклокерские модели (этих видно по большой рабочей частоте). И встречаются с пониженным напряжением - эти должны маркироваться как DDR3L и с вашим железом работать скорей всего не будут.
    Ответ написан
    Комментировать
  • Материнская плата не поддерживает AHCI,как поставить SSD?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Чипсет, судя по всему, AHCI всё-таки умеет. А вот ASUS для этой платы таковую настройку не предоставляет в биосе и контроллер остаётся в режиме эмуляции IDE. Что делать: страдать.
    Накопитель должен заработать, но без TRIM'а довольно заметно просядет по производительности. Впрочем, в этих условиях контроллер Barefoot 3 далеко не самый худший вариант : www.fcenter.ru/online/hardarticles/hdd/37859-Tverd...

    Потом, у меня довольно большие сомнения, что плата и ваш процессор умеют 8гб планки памяти. Возможно, только планки по 4гб умеют максимум.
    Ответ написан
    3 комментария
  • UNMOUNTABLE_BOOT_VOLUME полетел ли жесткий диск?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Начните с проверки самочувствия HDD. Загрузитесь в MHDD, посмотрите смарт и сделайте тест поверхности.
    Ответ написан
    8 комментариев
  • Задачка по mysql?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    select u.email, p.post_id, TIMESTAMPDIFF(DAY, p.publicated_to, now())
    from users u
    join posts p ON user_id =u.id

    https://dev.mysql.com/doc/refman/5.6/en/date-and-t...
    Ответ написан
    Комментировать