Ответы пользователя по тегу MySQL
  • Как безопасно открыть доступ к MySql для разработчиков?

    @dredd_krd
    Можно в конфиге MySQL сделать bind-address=0.0.0.0, и внутри самого MySQL создать пользователя с доступом с конкретного IP. Либо поднять что-либо вроде phpmyadmin, где запретить рутовый доступ. Обезопасить - назвать папку как-нибудь сложно, чтоб подобрать не могли, или опять же разрешить доступ к этому хосту с определённых IP-адресов в "Allow from ...", если IP статические.
    Для разработчиков будет достаточно обоих вариантов.
    Ответ написан
    Комментировать
  • Добавление записей к существующей записи в mysql?

    @dredd_krd
    Для изменения строки делается UPDATE, для добавления - INSERT. Вот видимо здесь имеют место попытки именно добавить, а не изменить запись.

    Если же уникальность должна придавать связка слово-страна, то рекомендую добавить уникальный ключ на эти 2 поля, и тогда при инсерте, если такая связка уже существует, поле толкования будет обновляться, а не создаваться ещё одно:
    INSERT INTO `tbl` (`word`, `country`, `interpret`, `translate`) VALUES ('bla', 'bla', 'bla', 'bla') ON DUPLICATE KEY UPDATE `interpret` = VALUES(`interpret`), `translate` = VALUES(`translate`);
    Ответ написан
    Комментировать
  • Как лучше организовать отказоустойчивость между дата-центрами?

    @dredd_krd
    И быстрыми NS-ами буду переключать точку входа в проект, менять А-запись для домена, в последствии автоматизирую это переключение.

    В любых ОС реализовано кэширование DNS. Если возможности его отключить нет, то идея с DNS скорее всего провальна. Да и смотря сколько кэш держит.

    Как мне кажется, можно сделать репликацию master-master между двумя хранилищами, и в коде фронтенда (если же он будет находиться в третьем месте) при сбоях (возможно даже автоматом) переключать БД с одного хранилища на другое. При восстановлении связи отставшая база наверстает упущенное, и можно будет переключать обратно, если она является самой оптимальной по производительности.
    Ответ написан
    Комментировать
  • Как сделать правильно выборку из базы?

    @dredd_krd
    SELECT `SC_categories`.* FROM `SC_categories` LEFT JOIN (SELECT DISTINCT(`parent`) FROM `SC_categories`) AS `list` ON (`SC_categories`.`category_ID` = `list`.`parent`) WHERE `list`.`parent` IS NULL

    вроде ничего не перепутал..

    UPD1:
    да, проверил, работает

    mysql> select * from `SC_categories`;
    +-------------+--------+
    | category_ID | parent |
    +-------------+--------+
    |           1 |      0 |
    |           2 |      1 |
    |           3 |      2 |
    |           4 |      0 |
    |           5 |      4 |
    |           6 |      2 |
    |           7 |      6 |
    +-------------+--------+
    7 rows in set (0,00 sec)
    
    mysql> SELECT `SC_categories`.* FROM `SC_categories` LEFT JOIN (SELECT DISTINCT(`parent`) FROM `SC_categories`) AS `list` ON (`SC_categories`.`category_ID` = `list`.`parent`) WHERE `list`.`parent` IS NULL;
    +-------------+--------+
    | category_ID | parent |
    +-------------+--------+
    |           3 |      2 |
    |           5 |      4 |
    |           7 |      6 |
    +-------------+--------+
    3 rows in set (0,00 sec)
    Ответ написан
    1 комментарий
  • Как составить запрос MySql?

    @dredd_krd
    Мне кажется, дизайн не совсем верный. Если это логи - это одно, а если рабочая таблица с тикетами - то лучше время создания и время закрытия указать соседними полями, и просто отнимать в селекте, получая это промежуточное время. Это в разы проще и правильнее.
    А так, в качестве велсипеда можно подзапросом выбрать сначала время открытия тикета, потом время закрытия, и отнять.
    Если увижу реальный select тикета с полями и данными, могу составить
    Ответ написан
  • Почему не работает POST?

    @dredd_krd
    Иногда бывает необходимо вместо "<?" писать "<?php".
    А если "пустая страница", т.е. полностью пустая - смотреть в логи apache (access.log), возможно где-то ошибка, а вывод ошибок на экран отключен.
    Ответ написан
    Комментировать
  • Как устранить тормоза таблицы после большого delete?

    @dredd_krd
    Partitions, быстро и просто. Каждый день по скрипту можно добавлять partition на следующий день, а когда нужно удалить какую-нить таблицу - просто дропаешь partition, и остальные данные остаются. Не нужно ни переименовывать таблицы, ни удалять старые. Таблица остается жива и доступна, нет моментов, когда она может быть не доступна (напр., в момент переименования).
    Данные по partition-ам распределяются как раз по значению ключа, поэтому проблем не возникнет.
    Ответ написан
    7 комментариев
  • Сохраняется ли порядок в результате запроса без Order By?

    @dredd_krd
    InnoDB - таблица без особых оптимизаций и сжатий. Если из середины удаляется запись - место под неё просто остается, не дефрагментируясь, и при следующем insert-е запись может упасть в это место в середине (чтоб не пустовало). Когда же где-нибудь в середине место заканчивается, записи начинают падать в конец. Поэтому, насколько я понимаю, при последовательном проходе (при выборке без условий) записи могут выбираться так, как находятся в файле базы, да. Да и сам такое поведение замечал неоднократно.
    Ответ написан
  • MYSQL Как превратить столбцы в строки?

    @dredd_krd
    С этим может справиться оператор UNION. Он может объединять разные запросы так, чтобы их вывод помещался в следующую строку результирующей таблицы, вместо соседних полей
    т.е. например запрос "(SELECT 'abc' AS `bla`) UNION (SELECT 'def' AS `bla`) UNION (SELECT '123' AS `bla`)"
    выдаст в результате:
    +------------------+
    | bla              |
    +------------------+
    | abc              |
    | def              |
    | 123              |
    +------------------+

    Так можете побить свой запрос на составляющие этого UNION и объединить их таким образом с его помощью.
    Но есть нюанс: вывод подзапросов, объединяемых UNION, обязан иметь формат результирующей таблицы, чтобы она могла нормально "склеиться"
    Ответ написан
  • Почему раз в месяц из таблицы БД могут удаляться строки? Как найти дыру?

    @dredd_krd
    Можно проверить код и проанализировать все запросы, начинающиеся с DELETE, и вычислить, при каких условиях в данном коде они могут выполняться так, чтобы совпадало с проявляемой проблемой.
    Сами по себе строки удаляться не могут, поэтому их точно что-то удаляет. А раз так, то проблема должна быть где-то на поверхности
    Ответ написан
    Комментировать