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

    @ollisso
    Главный вопрос, как часто меняется таблица, сколько планируется доп. полей. и насколько есть данные поля у всех строк?

    Т.е. пример:
    если есть поле которое есть у 1 из 1000 записей, то имеет смысл выносить в отдельную таблицу.

    Такие же поля как "дата создания", "номер автора" и тп , то имеет смысл хранить в основной таблице publications.

    Это возможно не совсем полостью нормализированная таблица, но это практичнее :)
    Ответ написан
    Комментировать
  • Как вести историю изменений сущностей в системе?

    @ollisso
    > Тупо создается таблица для истории изменений
    Лучше умно :)

    Зависит что именно вы хотите сделать, т.е. какие бизнестребования.
    Вариант 1:
    нужно просто иметь лог о том что изменилось. В этом случае, вы можете просто при любом изменении писать лог:
    кто изменил, когда, что изменилось, старое значение, новое.

    Вариант 2:
    вам нужно в любой момент иметь возможность откатить до указанного состояния (как вики, например).
    Тогда делаете п1 и добавляете функционал работы с логами.

    Но самое прстое - просто сделать лог.
    Ответ написан
    Комментировать
  • Как получить два значения MYSQL?

    @ollisso
    если нужно и так все строки получить, то выбираете их и уже скриптом отбираете что нужно.

    тот же array_slice и тп.
    Ответ написан
    Комментировать
  • В этом случае пропадает преимущество от использования строк фиксированной длины?

    @ollisso
    ситуация зависит от типа данных внутри таблицы, и того, какие у вас данные хранятся в фиксированном поле.

    Если нет VARCHAR, то все строки имеют фиксированную длину на диске. Т.е. если у вас 1 строка фиксированной длины - 100 байт, то 1000ая строка на диске, имеет позицию 1000 * 100 (условно) Это обычно ускоряет считывание с диска. Как только есть хоть 1 varchar, строки больше не фиксированные - нет никакой оптимизации.

    Другой случай - надо знать, что вы храните в данных? Например, если вы там всегда храните 3 значный код, который всегда ровно 3 знака, то CHAR лучше из за того что он требует на 1 байт меньше для хранения, даже если другие столбцы varchar. Внутри VARCHAR - есть дополнительный символ "конец данных", который увеличивает требуемое место на диске. Если же у вас данные не фиксированной длины, т.е. иногда 1, иногда 2, иногда 3 знака - то CHAR не имеет смысла в данном случае - особой экономии нет на диске.

    Да, это всё имеет смысл только если у вас ОЧЕНЬ много данных. Для таблиц до 10000 строк особой разницы нет.

    Итого:
    * CHAR имеет смысл только если у вас строки фиксированной длины, и только если много строк в таблице.
    Ответ написан
    Комментировать
  • Можно ли делать бекап базы mysql если идут записи?

    @ollisso
    Если вся база в InnoDB - То можно, через командную строку:
    mysqldump --single-transaction ...
    Через phpmyadmin - не уверен.
    Ответ написан
    Комментировать
  • Как исправить [FAIL] Starting MySQL database server: mysqld failed?

    @ollisso
    150911 14:58:19 [Note] Server hostname (bind-address): '127.0.0.1'; port: 3306
    150911 14:58:19 [Note] - '127.0.0.1' resolves to '127.0.0.1';
    150911 14:58:19 [Note] Server socket created on IP: '127.0.0.1'.
    150911 14:58:19 [ERROR] Can't start server: Bind on TCP/IP port: Cannot assign requested address
    150911 14:58:19 [ERROR] Do you already have another mysqld server running on port: 3306 ?

    порт 3306 занят

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

    @ollisso
    Для начала объясню почему индексы в вашем случае не работают и не могут работать.

    > OR links.domain LIKE CONCAT(sites.domain, '.%')

    CONCAT - это функция, и вы работаете с результатом функции.
    Т.е. получается что в вашем запросу нужно:
    1. выбрать все строки из links
    2. подсодеденить к каждой строке по sites.domain или sites.domain результат фунции.
    => нужно посчитать каждую строку каждый раз.
    Это очень много.

    что я бы сделал:
    1. создал таблицу доменов
    в ней:
    id | main_id |domain
    1 | 1 | com.youtube
    2. | 1 |com.youtube.www
    3. | 1 |com.youtube.subdomain


    Во всех таблицах - перешёл бы на этот ключ.
    2. тогда ваша выборка сокращается до:

    SELECT links.id, links.url, sites.id AS site_id, sites.description 
    FROM links
    LEFT JOIN domains ON links.domainId = domains.id
    LEFT JOIN sites ON sites.id = domains.main_id

    (смутно понимаю что вы хотели в этом запросе, поэтому уж не обессудьте :) )

    Т.е. основной посыл:
    переходите на int- ключи

    PS: Так же это называется нормализация базы данных. Хранить много одинаковых строк - это плохо.
    Ответ написан
    5 комментариев
  • В чем разница в mysql таблицы между dynamic и fixed?

    @ollisso
    если fixed, то длинна строки (в байтах ) - всегда одинаковая.
    Это удобнее для чтения с диска

    Если же dynamic - то длинна строки в байтах может быть разной.

    Изменить это можно повлияв на тип столбца:
    если тип столбца: text, tinytext, varchar, и тп - то будет dynamic
    если же только intы всех видов, char, bit и тп - то fixed
    Ответ написан
  • Как хранить Unix time в mysql?

    @ollisso
    смотрите:
    select UNIX_TIMESTAMP();
    select FROM_UNIXTIME(UNIX_TIMESTAMP());
    Ответ написан
    Комментировать
  • Как вытянуть с базы (mySql) всех друзей пользователя, друзей друзей и так до конца?

    @ollisso
    Самый простой способ:

    В момент изменения списка друзей - пересчитываем вручную друзей до 5ого уровня и сохраняем в таблице вида:
    user_id,friend_id, level

    Так как редактирование списка друзей - событие реже чем выборка" - то это имеет смысл чтобы выборка была быстрая.

    Правда на больших объёмах - (Сотни людей) - могут быть проблемы :)

    2ой способ, в момент выборки, так как у нас ограничен уровень вложения: (но сражу скажу что этот способ намного хуже)

    друзья первого уровня:
    select friend_id from users_friends where user_id  =1;


    Друзья второго уровня:
    select lvl2.friend_id 
    from users_friends as lvl1
    right join users_friends  as lvl2 on lvl2.friend_id=lvl1.user_id
    where lvl1.user_id  =1;


    Дальше уровни по аналогии

    а чтобы это всё вместе возвращало:

    select friend_id from users_friends where user_id  =1 UNION
    select lvl2.friend_id  from users_friends as lvl1 right join users_friends  as lvl2 on lvl2.friend_id=lvl1.user_id where lvl1.user_id  =1;


    Правда на больших объёмах производительнсть будет хромать.

    использую такую таблицу:
    users_friends: -друзья юзеров
    user_id, friend_id (причём для каждой "дружбы" - две записи)

    способ 3:
    делать подобную выборку как в п1 и хранить в кеше локальном (требуется 5 запросов

    Способ 4:
    написать процедуру которая делает то же самое что в п1-п2
    Ответ написан
    Комментировать
  • PHP/Yii2: как ускорить выполнение ~1 млн запросов подряд?

    @ollisso
    2 варианта я вижу:

    1. LOAD DATA - выше уже дали ссылку.

    2. insert сразу многих строк:

    Пример:
    INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);

    dev.mysql.com/doc/refman/5.6/en/insert.html

    + лучше всего тюнинг сервера, чтобы он был готов к таким объёмом (миллион строк - это ничего не говорит)

    а как именно сервер не справляется ? (миллион строк - это ничего не говорит)
    Ответ написан
    Комментировать
  • Как сделать Insert при определенных условиях?

    @ollisso
    1. Можно реализовать через процедуры
    2. можно реализвоать через уникальный ключ (UNIQUE KEY) и insert ignore

    Т.е. я понял что вам нужно вставить строку только если строки с ключом game=ключ2 нету.

    ну тогда и делайте game =ключ2 уникальным ключом, и добавляйте через insert ignore into tickets ...
    Если ключа нет - то он вставится. Если есть - то строка будет пропущена.
    Ответ написан
  • Mysql: select from select?

    @ollisso
    смотрите explain, почему оно не работает

    можно попробовать сказать mysql какой ключ использовать:
    https://dev.mysql.com/doc/refman/5.1/en/index-hint...
    Ответ написан
    Комментировать
  • SQL Обновить поле int в таблице инкрементируя начальное значение?

    @ollisso
    а чем такое не подходит ? :)

    set @rownumber := 0;
    update `cases` 
          set `ordered` = (@rownumber := @rownumber + 1)
    order by ordered ASC
    Ответ написан
  • Как объективно протестировать производительность node.js и PHP в запросах к mysql БД?

    @ollisso
    мысли вслух:

    PHP: mysql_query делает запрос и буфферизирует результат. в памяти.
    Если делать это 1000 раз, то каждый раз сохраняется буффер. Можно надеяться что он опустошается после каждой строки, но это не 100%.

    NodeJS: возможно это не делает, стоит добавить чтение этих строк в переменную.
    Ответ написан
  • Стоит ли избавляться от JOIN за счет добавления нового SELECT в SQL?

    @ollisso
    У меня были случае в работе, когда убирание джойнов ускоряла работу запросов.

    Но это выяснялось только после часов работы с Explain. в 99% случаях - join быстрее.

    изучайте как пользоваться explain.
    Ответ написан
    Комментировать
  • MySQL Total Client Connection почему без конца увеличивается?

    @ollisso
    1. смотрим show processlist и смотрим, в каком состоянии процессы.
    Если висит запрос - оптимизируем его, отключаем и тп.

    2. если запрос не висит, а просто открытый конект, то смотрим, какой тип подключения вы используете: mysqli, mysql_connect, mysql_pconnect, pdo.

    если вы используете постоянные конекты (mysql_pconnect и тому подобные) - то возмонжо вам стоит перейти на обычные конекты.
    Так же, возможно вам стоит поменять mpm в апаче.
    Ответ написан
    Комментировать
  • Где тут синтаксическая ошибка?

    @ollisso
    Запрос ок, но в ошибке выводится 2 раза селект. Где то добавляется?
    Ответ написан
  • Оптимизация Mysql. Типы данных. Правильно ли я понял?

    @ollisso
    1. желательно да, иначе вы неправильно используете пространство.
    Пока у вас < 1000 строк это не страшно. но если у вас миллион строк - то таблицы могут уменьшится в разы.

    2. можно ещё BIT но с ним сложнее работать. можно использовать tinyint.
    3. если длинный текст (более 255 символов) то лучше использовать tinytext, text, longtext и тп. Плюс varchar - можно делать индекс на него. На text сделать индекс не оптимально, насколько я помню.
    4. tinyint или bit
    5. varchar - столько, сколько данных + системные символы (несколько байт)
    char - занимает фиксированное количество места.

    посмотрите, может у вас индексы слетели каким либо образом ? Обычно именно индексы оказывают серьёзное влияние на прозводительность, а не размер полей.
    Ответ написан
    Комментировать
  • Запрос из PHP к mysql не выдает ответа в исправном скрипте с вероятностью 99%?

    @ollisso
    Если уж вы используете mysql_query то проверяйте нормально на ошибки а?

    Пример из документации:
    <?php
    $result = mysql_query('SELECT * WHERE 1=1');
    if (!$result) {
        die('Invalid query: ' . mysql_error());
    }
    
    ?>


    Поменяйте свой запрос и начните читать документацию
    Ответ написан