Ответы пользователя по тегу MySQL
  • В каких случаях использовать - redis или memory в mysql?

    Wolfnsex
    @Wolfnsex
    Если не хочешь быть первым - не вставай в очередь!
    В каких случаях вы стали бы использовать redis для хранения кеш данных (или не кеш), а в каких storage engine = MEMORY
    Лично я - наверное во всех случаях, в которых Redis для этого подходит. От части по тому, что проекты требующие кэширования такого уровня, в основном (*конкретно в моей практике, по факту - это не говорит ни о чём) комплектуются Postgres'ом.

    Среди прочих достоинств - редиска умеет сохранять данные да диск, это может быть важно/нужно.

    В остальных случаях, главное - без фанатизма это делать. Нет "едноправильного" решения, которое бы дало 100% результат. У Вас определенные требования к задаче, есть инструмент. Если MEMORY_ENGINE работает нормально (т.е. Вас показатели устраивают), и у Вас уже установлен MySQL и он работает - зачем тащить ещё Redis? Это усложнит систему, хоть и не сильно.

    Если у Вас нет MySQL, или MEMORY_ENGINE по какой-то причине не устроил, например, Вам нужно сохранять данные на диск или [причина-N] - берём Redis.

    Так же, стоит заметить, что функциональность MEMORY_ENGINE немного шире, в виду наличия полноценного SQL-движка, и в целом логически отличается от редиски.

    А есть ещё Memcached...

    2) есть еще любопытный костыль - InnoDB on RAMdisk , кто что думает по этому поводу?
    По моему, решение уровня "так себе". Мне эта идиома не нравится.

    Да, и в целом - Redis - это именно кэш-хранилище, со скроком жизни кэша "из коробки" (как пример), MEMORY_ENGINE - это полноценная таблица, со всеми вытекающими из этого фактами. Функционал, как я уже писал выше - немного разный...

    P.S. В MySQL я помню, грозились ввести какой-то новый движок, как раз для того, что бы "затмить" все Redis'ы с Memcached'ами вместе, но что-то я не нахожу информации по этому поводу... а ведь точно помню, что читал такое!
    Ответ написан
    Комментировать
  • Как хранить НЕ plain text сообщения в базе данных?

    Wolfnsex
    @Wolfnsex
    Если не хочешь быть первым - не вставай в очередь!
    Почему бы не сделать это через JavaScript? Ищем в сообщении шаблон вида "@буквы", если то, что после "@" есть в списке пользователей, который можно например, закэшировать в браузере или запрашивать через AJAX - меняем "это" на соотв. ссылку или то, что на нужно.

    Вариант 2: Парсим сообщение на сервере, в поисках шаблона "@буквы" (можно через регулярку), если пользователь есть в базе - заменяем на соотв. код (ссылка, выделение и т.д.).

    Так на вскидку, первый вариант подойдёт для выделения личных сообщений, второй - для того, что бы имена выделялись вообще, как таковые (как например, на тут, на Тостере).
    Ответ написан
  • Вопрос к опытным админам. Где набраться достаточно опыта в кратчайшие сроки?

    Wolfnsex
    @Wolfnsex
    Если не хочешь быть первым - не вставай в очередь!
    С учётом того, что по Postgres'у я уже не первый год возвращаюсь к чтению его документации - думаю, что "самоучителя" вменяемого, вряд ли найти удастся. Или это будет книга просто феерического объёма.

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

    Общая теория реляционных БД - на эту тему, я думаю, Вы без проблем книги найдете.

    Телефония - вообще плохо знаком с темой и особо не интересовался, пропущу.

    Администрирование Linux - очень мало вероятно, что Вы найдете что-то полноценное. Во первых, по тому, что эта тема тянет за собой целую цепочку буквально всего, от сети и сетевых протоколов заканчивая механизмами ядра. Linux - это не только несколько штук/десятков/сотен/... команд в командной строке, это буквально всё, от установки софта и настройки веб-сервера до леший ещё знает чего. Вы легко найдете интересующий по какой-то конкретной теме, например, по работе с командной строкой, или по настройке того же веб-сервера, или по настройке iptables например. Но с учётом того, что по одному только iptables уже написана не одна книга (это же относится к командной строке, текстовому редактору vi и т.д., по всем этим темам есть как минимум одна книга посвященная только ей), представьте себе объём информации по теме "администрирование".
    Ответ написан
  • Как лучше хранить данные о трафике в БД?

    Wolfnsex
    @Wolfnsex Куратор тега Веб-разработка
    Если не хочешь быть первым - не вставай в очередь!
    Подскажите, как лучше хранить все это дело в базе? Я думал хранить в одной величине, например, в байтах, но что-то слишком большие цифры получаются.
    Если эти числа не выходят за максимальный допустимый размер (диапазон), например 9223372036854775807 - знаковое, 18446744073709551615 - без знаковое BIGINT, то скорее всего, ничего лучше, для хранения чисел (чем специальный тип БД, предназначенный для хранения именно чисел) - Вы не найдете.

    P.S. Если нужна точность до байт - хранить нужно в байтах. Если до мегабайт - соотв. округлять значения и хранить в мегабайтах. Т.е., в зависимости от необходимой точности можно выбрать конечную величину. Обработка больших цифр (целочисленных) - для компьютера не есть проблема, числа обрабатываются в ряде случаев, лучше чем например, текст.
    Ответ написан
    1 комментарий
  • Mysql_query() какой синтаксис для foreign key?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    А как связан синтаксис SQL с "драйвером" (прокладкой PHP<->MySQL) БД? Вам говорят о том, что вместо mysql_ нужно использовать либо mysqli_, либо PDO, на синтаксис это не влияет никак вообще.

    Примеров полно, например тут.
    Ответ написан
    4 комментария
  • Как сохранять большие тексты при частых, но незначительных изменениях?

    Wolfnsex
    @Wolfnsex
    Если не хочешь быть первым - не вставай в очередь!
    1. Для создания дельты изменений в чем бы то ни было (в тексте, или в бинарных данных и т.п.) есть утилиты/алгоритмы, уже готовые. Можете взять их и адаптировать под себя, например diff. Как это будет реализовано на уровне JS'а в браузере я пока не очень представляю, но гипотетически - это вполне возможно/реализуемо.

    Как решить эту проблему? Возможно ли частичное обновление поля в MySQL

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

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

    Как выявить частичные изменения, чтобы не гонять весь текст целиком, а только внесённые изменения? Поделитесь опытом.
    Ответ на этот вопрос содержится в 1-м абзаце, выше по тексту :)

    Кроме того, как только пользователей станет много, подозреваю, сервер ляжет.
    Довольно странно будет, если у Вас база ляжет от такой нагрузки... Это скорее больше похоже, опять таки, на серьёзные ошибки в архитектуре, а не проблемы БД/сервера как таковых.
    Ответ написан
    Комментировать
  • Сколько ОЗУ на VPS потребуется?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    Хватит ли оставшейся оперативки если установлю apache + php + mysql?

    Для того, что бы оно запустилось - думаю хватит.

    Нагрузка на сервер предполагается мизерной — бот на php для telegram.

    Зачем Вам Apache или вообще веб-сервер? Запускайте скрипт из консоли. Можете попробовать встроенный в ПХП веб-сервер.

    При жесткой необходимости можно отказаться от mysql и хранить данные в файлах.

    При жесткой необходимости, и в её отсутствие тоже, можно отказаться от MySQL и хранить данные в SQlite3.

    P.S.
    панель показывает: 120.2 MB of 256 MB Used / 135.8 MB Free
    Единственное, что меня смущает - как и зачем Вы умудрились панель вкрутить на сервер с 256Мб оперативки :)) Но... это в принципе к делу не относится, просто мысли вслух.
    Ответ написан
    6 комментариев
  • Что это означает Warning: 1265 Data truncated for column?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    Мне кажется, у меня есть ответ на Ваш вопрос... Или вот.
    Ответ написан
  • Где ошибка в SQL запросе?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    Где синтаксическая ошибка в запросе?

    Скорее всего, ошибка в "***" в имени таблицы и в отсутствии запятых, после SET.
    Ответ написан
    Комментировать
  • Каким образом реализовать удаление записи из БД?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    Порядок действий такой:
    1. Берём inotify
    2. Ставим на мониторинг нужную папку
    3. При наступлении события "файл N удалён" запускаем скрипт, который будет удалять соотв. запись из БД
    4. Enjoy!
    Ответ написан
    6 комментариев
  • Как устранить ошибки при переносе сайта?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    Вообще суть такая : я перекинул сайт с одного хостинга на другой. Вылезло куча ошибок. Некоторые из них я понял - типо поставьте новую версию mysql (изменил файл config.php поставил mysqli , всё отлично, ошибки исчезли).

    Решение "в лоб" - на новом хостинге - поставьте версию PHP поменьше, предположительно 5.3, и все ошибки пропадут с большей вероятностью.

    Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /home/users/3/375297078078/domains/biceps.napervoy.ru/vqmod/vqmod.php on line 247

    С вероятностью 99% - из-за новой версии ПХП, модификатор "е" в регулярках устарел. Удалить его оттуда совсем и/или переписать регулярку соотв. образом

    Parse error: syntax error, unexpected 'elseif' (T_ELSEIF), expecting function (T_FUNCTION) in /home/users/3/375297078078/domains/biceps.napervoy.ru/system/database/mysqli.php on line 54

    Тут нужно строку с кодом смотреть, что-то на вскидку ничего в голову не приходит.

    P.S. Наиболее простое решение проблем(ы) - я озвучил в первом абзаце.
    Ответ написан
    2 комментария
  • Как получить порядковый номер записи при сортировке?

    Wolfnsex
    @Wolfnsex
    Если не хочешь быть первым - не вставай в очередь!
    SELECT t.*, @rownum := @rownum + 1 AS rank FROM help_topic t, (SELECT @rownum := 0) r


    Источник

    P.S. Проверил, работает.
    Ответ написан
    8 комментариев
  • Как хранить неполную дату в Mysql?

    Wolfnsex
    @Wolfnsex
    Если не хочешь быть первым - не вставай в очередь!
    С учётом сущности "квартал" - вряд ли получиться логичней, не припоминаю ни одного готового формата/стандарта даты в БД, где было бы поле "квартал", если только свой составной тип сделать, но такой фунционал "из коробки" в MySQL отсутствует и вряд ли так вот просто получиться в MySQL его "вкрутить".

    Единственный вариант, который приходит мне в голову - изобрести свой формат даты на основе поля CHAR/VARCHAR, типа ГОД-КВАРТАЛ-МЕСЯЦ-ДЕНЬ, и пустые значения соотв. заполнять нулями, так по крайней мере будет какой-то намёк на корректную сортировку.
    Ответ написан
    Комментировать
  • Sql атака, кто сталкивался?

    Wolfnsex
    @Wolfnsex
    Если не хочешь быть первым - не вставай в очередь!
    Числа с ведущим нулём (т.е. начинающиеся на 0x) обычно означают 16-ричную систему счисления.

    Кое-что про подобные случаи уже писали, например тут.

    P.S. Но Вам самому не кажется странным, что кто-то вообще смог зарегистрировать такого пользователя?
    Такого:
    а) Какой-то адово длинный логин
    б) Спец. символы в имени (звездочки, слеши и т.д.)

    Мне видится, что такое сочетания абро-кадабр отлично подошло бы для пароля, но для логина - должно было отфильтроваться сразу же.
    Ответ написан
    2 комментария
  • Как правильно организовать структуру таблицы MySQL?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    все таки стоит их просто разделить ролями, но хранить в одной таблице?

    Иначе говоря, не денормализовывайте данные (не дробите их).

    В MySQL есть связи между таблицами, стоит ли хранить например, телефоны юзеров в отдельной таблице "phone_numbers" и по id их связывать с главной таблицей юзеров?

    Стоит, если у Вас действительно большой объём данных, сервер не справляется а телефони пр. параметры - запрашиваются относительно редко по сравнинию кол-вом запросов в таблицу пользователей. В этом случае, все редко используемые данные выносят в отдельную таблицу, что бы физически разделить их на диске и уменьшить объём основной таблице. При этом, данные из доп. таблицы получают отдельным запросом (без JOIN'ов). А вообще, когда такое случается (когда данных уже столько, что массив дисковый массив захлёбывается и данные приходятся дробить, индексы перестают работать нормально а внешние ключи сыпятся) - уже пора переходить на Postgresql, а не мучить MySQL, которая тихи и мирно начинает скатываться в "черную дыру непонятных ошибок"...
    Ответ написан
    2 комментария
  • Как переиспользовать значения удаленных user_id?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    Можно. Вместо физического удаления записи - отмечайте её флагом "DELETED" (условно). Потом поиск первой свободной записи, примерно так:
    SELECT min(id) FROM my_table WHERE deleted = 1;
    А потом вместо добавления новой записи - обновляете существующую, с найденным ID.

    Как-то так.

    Можно одним запросом найти запись с минимальным ID и обновить её, установив попутно флаг DELETED = 0;
    Ответ написан
    Комментировать
  • Как лучше сделать структуру таблиц?

    Wolfnsex
    @Wolfnsex
    Если не хочешь быть первым - не вставай в очередь!
    1. В таблице заявок в поле статуса хранить json вида

    В MySQL так делать не стоит, JSON поля не индексируются.

    Я бы сделал так:
    Создаём таблицу нужной структуры, добавляем поля:
    status - ENUM (список), из двух пунктов, типа accepted/rejected. Если значений не много - список вполне подойдет.
    status_comment - комментарий к статусу, который заполняется только в случае, если статус стоит как "отказано".

    *Фактическое наличие поля в таблице - не говорит об обязательности его заполнения.

    Если статусы планируется в последствии добавлять, можно сделать ссылку на доп. таблицу со статусами.

    Или, статусы можно отмечать просто цифрой, например,
    0 - отказано
    1 - принято
    2 - в процессе принятия решения
    и т.д.

    А текстовое описание каждого статуса хранить в виде констатнт класса/структуры/объекта внутри Вашей программы.

    P.S. Если принципиально важно, что бы при любом статусе отличном от "Отказано" не было комментария к статусу, именно на уровне БД - на таблицу можно повесить триггер, который это поле будет очищать.
    Ответ написан
    2 комментария
  • Как сделать условие для select max mysql?

    Wolfnsex
    @Wolfnsex
    Если не хочешь быть первым - не вставай в очередь!
    На вскидку как-то так:
    select max(price ) as price from sina WHERE top = 1
    UNION
    select max(price ) as price from sina WHERE top = 2
    Ответ написан
    5 комментариев
  • Какие различия синтаксиса SQL-запросов MySQL от Firebird?

    Wolfnsex
    @Wolfnsex
    Если не хочешь быть первым - не вставай в очередь!
    Я точно не помню уже, давно с FB работал... Но, из всех известных мне SQL-БД -- MySQL единственная база, из тех, что изобрели "Свой SQL с блекджеком и... своим форматом LIMIT'а".

    Вот, нашел цитату, касательно FireBird 1.5:
    Firebird полностью поддерживает SQL-92 Entry Level 1 и реализует большую часть стандарта SQL-99 c некоторыми очень полезными дополнениями. Это включает выражения DML/DDL, синтаксис объединений FULL/LEFT/RIGHT [OUTER] JOIN, выражения UNION, DISTINCT, подзапросы (IN, EXISTS), встроенные функции (AVG, SUM, MIN, MAX, COALESCE, CASE, ..), ограничения целостности (PRIMARY KEY, UNIQUE, FOREIGN KEY), и все общие типы данных SQL.


    Следуя выше написанному, и тому, что Postgres так же реализует большую часть этих стандартов, запросы должны работать и в FireBird и в Postgres, практически без изменений. Кроме того, насколько я помню, в FireBird (по крайней мере так было в версиях 1.5 и 2.х) так же как и в Postgres используются "последовательности", вместо MySQL'евского AUTOINCREMENT'а.

    Подводя итог, хочу сказать, что Вам нужно искать не то, чем синтаксис FireBird'а отличается от MySQL'евского, а то, чем MySQL'евский-SQL отличается от стандартов SQL.

    своеобразный LIMIT
    -- LIMIT/OFFSET? Если Вы про него, то это не "своеобразный" LIMIT, это LIMIT в соответствии со стандартами, LIMIT через запятую - это изобретение авторов MySQL'я.
    Ответ написан
  • Как правильно работать с БД в команде?

    Wolfnsex
    @Wolfnsex
    Если не хочешь быть первым - не вставай в очередь!
    Да, называется "репликация мастер-мастер", по моему, лучший вариант.

    *Ещё можно использовать одну БД, доступную и Вам и всем остальным членам команды, и не страдать :))

    **Если Вы используете SQLite, которая не поддерживает сетевые подключения - можно расшарить файл БД через сетевой диск и таким образом совместно работать с ним.
    Ответ написан
    Комментировать