Ответы пользователя по тегу MySQL
  • Почему не работает запрос в БД?

    ruFelix
    @ruFelix
    Предсказание будущего по руке, таро, кофе.
    $NameVideo = $_POST ['name'];
    $idVideo = $_POST ['message'];
    echo $NameVideo;
    $db = mysql_connect("localhost","d9",774272722");
    mysql_select_db("dlx",$db);
    mysql_query("SET NAMES utf8");
    $resultat = mysql_query("INSERT INTO `dlx`.`videoByMe` (`id`, `DenumireaVideo`, `VideoMixID`) VALUES (NULL, '$NameVideo', '$idVideo')"); // тут был бардак с кавычками
    if(!$resultat){
     var_dump(mysql_error()); // тут скорее всего ругнётся, что id не может быть NULL
     exit();
    }
    mysql_close($db);
    Ответ написан
    Комментировать
  • Как при помощи JOIN выбрать несколько значений?

    ruFelix
    @ruFelix
    Предсказание будущего по руке, таро, кофе.
    SELECT p.`obj_id`
     FROM  `products` p
    LEFT JOIN  `objects` o ON p.`obj_id` = o.`id`
    LEFT JOIN  `objects_fields` oc ON p.`obj_id` = oc.`obj_id` 
    WHERE oc.`field_id` = 221 OR oc.`field_id` = 248


    общие замечания.
    Условия которые не являются правилом объединения следует выносить в WHERE.
    Алисы таблиц должны быть уникальны для каждой таблицы, в вашем случае алис "oc" декларируется дважды
    Ответ написан
    3 комментария
  • MySQL got error 28 from storage engine, когда диск не заполнен?

    ruFelix
    @ruFelix
    Предсказание будущего по руке, таро, кофе.
    Для выполнения запроса(запросов) не хватило свободного места в /tmp
    При перезагрузке /tmp очистился соответственно mysql больше ничего не мешает.

    /tmp это папка с временными файлами туда пишут все программы, у неё может быть фиксированный размер или она может использовать общее пространство диска.

    При повторении проблемы обратите внимание на заполнение всех разделов, в выводе команды:
    df -h
    дальше уже думайтее по результатам
    Ответ написан
  • Mysql не принимает настройку table_open_cache, как всё таки сменить?

    ruFelix
    @ruFelix
    Предсказание будущего по руке, таро, кофе.
    В общем случае:

    Проверьте есть ли в /etc/security/limits.d/ что то про mysql
    если нет то создайте файлик /etc/security/limits.d/mysql.conf
    с таким содержимым:
    mysql           soft    nofile          65535
    mysql           hard    no file          65535


    Потом проверьте /etc/pam.d/common-session и добавьте если нет следующую строчку:
    session required pam_limits.so

    Если у вас свежий линукс дистрибутив использующий как основу systemd то лимиты выше не сработают для сервисов, тогда надо как то так
    Ответ написан
    1 комментарий
  • Как отобразить все процессы базы данных?

    ruFelix
    @ruFelix
    Предсказание будущего по руке, таро, кофе.
    Это обёртка SHOW FULL PROCESSLIST и частота опроса в ней больше чем время выполнения запросов.
    включите логирование в my.cnf и используйте tail -f log.file
    Ответ написан
    1 комментарий
  • Как выполнить сортировку в в mysql?

    ruFelix
    @ruFelix
    Предсказание будущего по руке, таро, кофе.
    (SELECT * FROM tb WHERE start_date < NOW() AND end_date > NOW() ORDER BY end_date ASC)
    UNION 
    (SELECT * FROM tb WHERE start_date > NOW() ORDER BY start_date ASC)
    UNION 
    (SELECT * FROM tb WHERE end_date < NOW() ORDER BY end_date DESC)


    для сортировки всего датасета надо добавить поля для неё, приблизительно так
    (SELECT *, 1 as f1, UNIX_TIMESTAMP(end_date) as f2 FROM tb WHERE start_date < NOW() AND end_date > NOW() ORDER BY end_date ASC)
    UNION 
    (SELECT * , 2 as f1, UNIX_TIMESTAMP(start_date) as f2 FROM tb WHERE start_date > NOW() ORDER BY start_date ASC)
    UNION 
    (SELECT *, 3 as f1, (UNIX_TIMESTAMP(start_date) -  UNIX_TIMESTAMP(end_date)) as f2 FROM tb WHERE end_date < NOW() ORDER BY end_date DESC)
    ORDER BY f1, f2 ASC
    LIMIT 10,10


    но раз вам нужен LIMIT то лучше как то так:
    SELECT
    	*,
    	if(end_date < NOW(),3,if(start_date > NOW(),2,1)) as f1,
    	if(end_date < NOW(),UNIX_TIMESTAMP(start_date) -  UNIX_TIMESTAMP(end_date),if(start_date > NOW(),UNIX_TIMESTAMP(start_date),UNIX_TIMESTAMP(end_date))) as f2
    FROM t1
    ORDER BY f1, f2 ASC
    LIMIT 10,10

    просто этот вариант сложно читаем и вы должны понимать, что в нём и предыдущем индексы для сортировки использоваться не будут никогда
    Ответ написан
    2 комментария
  • Какой самый оптимальный / надежный вариант для хранения данных?

    ruFelix
    @ruFelix
    Предсказание будущего по руке, таро, кофе.
    Взять redis и настроить синхронизацию с диском в зависимости от паранойи и производительности вашего сервера.

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

    ruFelix
    @ruFelix
    Предсказание будущего по руке, таро, кофе.
    Найдите способ добавить в WHERE условие которое ограничит множество product_shop.id_product тем которое сейчас входит в LIMIT.

    Т.е. этот запрос валят строки
    ORDER BY `sale` DESC
    LIMIT 0, 100;
    над ними и парьтесь.
    Ответ написан
  • Запрет на join? Оптимизированная выборка из связи многие-ко-многим без join с параметрами из линкованных таблиц?

    ruFelix
    @ruFelix
    Предсказание будущего по руке, таро, кофе.
    Они так говорят, потому что:
    1) Если вы везде используете JOIN то на большом проекте у вас перестаёт работать кеш встроенный в БД, т.к. insert или update хотя бы в одну из таблиц участниц join сбросит кеш всего запроса, а на больших проектах изменения данных идут постоянным потоком.
    2) JOIN делает жётские связи на уровне данных, это хоронит возможность оптимизации на уровне архитектуры приложения. Когда таблицы не связанны внешними ключами и запросами то мы можем перенести любую таблицу, в другую БД оптимизированную для нужных типов запросов, написать например на Си отдельный сервис/демон для этих данных. При этом нам надо будет переписать только одну сущность в приложении. В случае с разрешёнными JOIN может выясниться что переписать надо вообще всё.
    3) Существует популярный подход переваривания больших нагрузок/данных это шардинг, т.е. раскидывание диапазонов данных по разным серверам, это когда первые 10 миллионов записей лежат на одном сервере а вторые на другом, join в этом случае сделать нельзя.
    4) Нормализация, полностью нормализованная БД самая медленна(т.к. куча JOIN, каждый из них это умножение двух матриц), но зато самая компактная, полностью не нормализованная БД самая быстрая (так как всё берём одним простым запросом), но очень жирная и неприемлемо сложная в работе.

    Ваш пример очень абстрактен, если про него ясно только, что данных очень много и не известно кто и в каких условиях будет с этим работать, но скорость ответа важна, а количество запросов будет большими. (Например это API к которому сторонние люди будут писать приложения и потенциально рекламировать эти приложения по ТВ)
    То например так:
    1) Запросом c JOIN скормить данные этих двух таблиц в поисковый индекс на sphinxsearch
    2) Делаем запрос с параметрами book.param = 1 AND author.param = 2 поисковому индексу сфинкса, он возвращает нам PK ID нужных сущностей
    3) Делаем SELECT * FROM t WHERE id in(1,2,3..N)

    Таким образом мы получаем сложную и тяжёлую фоновую индексацию, но очень быстрые и отъедающие крохи ресурсов сервера запросы в онлайне. Из минусов сильно усложняем архитектуру, а соответственно написание, отладка и поддержка кода становятся намного дольше, а количество людей которые могут это делать намного меньше, что в свою очередь является серьёзной проблемой но другого уровня.
    Ответ написан
    Комментировать
  • Насколько важно сейчас начинающему веб-разработчику разбираться в SQL досконально?

    ruFelix
    @ruFelix
    Предсказание будущего по руке, таро, кофе.
    Реализация ORM обычно такова, что это тот же SQL синтаксис только в виде объекта вызовов методов объектов.

    1. В простых случаях, что то типа: User::findAll()->where(['id'=>10])
      Это как бы прикольно, но тот же SQL: SELECT * FROM user WHERE id =10 не выглядит более сложным.
    2. Join, ORM как бы скрывает джойны:

      $UserCollection = User::findAll()->where(['id'=>10]);
         foreach($UserCollection as $User){
            if($User->ProfileSetting->is_enable == 'yes'){
               doSomething($User);
            }
         }

      Тут как бы скрыто то, что запрос происходит к двум связанным таблицам (user и profile), это достаточно в многих случаях, но в любом случае это не круто, т.к. вы не знаете какой запрос или запросы генерит ORM и не понимаете, что происходит на самом деле.
    3. Внешний вид запросов в объектном представлении становиться тяжёлым для восприятия даже для запросов средней сложности, с SQL таких проблем нет.
    4. Для сложных запросов ORM не даёт ни чего, кроме варианта писать тот же SQL.


    ORM имеет серьёзные преимущества в кодогенерации, в написании автоматизированных тестов.

    Если у вас есть какие то планы стать не начинающем разработчиком, то вам неприменимо нужно начать разбираться как работают базы данных в целом, т.е. понимание реляционной алгебры (это по сути и есть SQL), и понимание того, что стоят запросы (насколько нагружают диск/процессор).

    Так происходит потому, что по мере роста вашей квалификации у вас будут пропадать сопутствующие задачи типа вёрстки и js, готовую архитектуру вам навяжут фреймворки, а вашей основной задачей будет манипуляции с небольшими блоками данных хранящимися в больших массивы данных.
    Ответ написан
    Комментировать
  • Как правильно хранить json c кирилицей в MySQL?

    ruFelix
    @ruFelix
    Предсказание будущего по руке, таро, кофе.
    У вас слеши пропадают на уровне php, это видимо можно проверить прогнав str_replace('\\u','\\\\u',json_encode($data));

    Глюки на уровне Mysql можно прореветь переведя тип поля в которое пишется json в тип blob, если стало ок, то что то не так с кодировками в базе или соединении с ней.

    json_encode($massx,JSON_UNESCAPED_UNICODE); не решит проблему со слэшами, они используются не только для юникода
    string.gif

    Дополнено:

    слеш в строчках служит для написания непечатных/управляющих кодов в виде букв. Это не mysql это везде так. Например \t это не слеш + t (два символа), это один символ табуляции. так же и \u это не два символа а один, чёрт пойми какой.

    если вы сделаете insert into t set col = 'a\n\n\nb'; а потом select col from t; то вы уведите:
    a

    b
    т.е. три пустые строки межу a и b, если вы хотите сохранить само сочетание \n, то нужно писать insert into t set col = 'a\\n\\n\\nb'; Тогда при селекте будет a\n\n\nb, т.к. для того, что бы закодировать слеш в строке его нужно экранировать тем же слешем. Это нормально.
    Ответ написан
    3 комментария
  • Mysql выборка или cookie, оптимизация?

    ruFelix
    @ruFelix
    Предсказание будущего по руке, таро, кофе.
    Когда ваши цифры будут в 1000 раз больше и не будет денег на нормальный сервер, тогда ваша вопрос станет актуальным. При таких цифрах кеш не будет освобождать ресурсы сервера, они и так должны быть свободны, соответственно смысла в кеше нет.

    Если при таких цифрах у вас всё тормозит вам нужно, что то из: сменить архитектуру БД или разобраться как работать с БД или нанять админа.
    Ответ написан
    8 комментариев
  • В чем лучше хранить данные для быстрого доступа?

    ruFelix
    @ruFelix
    Предсказание будущего по руке, таро, кофе.
    в лоб,
    писать данные в суточные или недельные таблицы, при их наполнение перекидывать данные в общую таблицу и сразу раскладывать по таблицам содержащим уже агрегированные данные.

    Соответственно результаты будут состоять из двух запросов: простого селекта по уже агрегированным данным + сам агрегирующий запрос по суточной таблице.

    Т.е. если вы, каким либо способом, избавитесь от запросов по всему датасету в онлайне, то эта схема проработает у вас очень долго (до полного исчерпания аппаратных ресурсов) в независимости от того какую БД вы будете использовать.
    Ответ написан
    Комментировать
  • Почему не получается определить количество результатов в запросе к mysql на php?

    ruFelix
    @ruFelix
    Предсказание будущего по руке, таро, кофе.
    1) Сомневаюсь, что вы используете mysql 3-ей версии, а ведь исключительно для поддержки совместимости с этим старым хламом расширение mysql ещё есть в некоторых не свежих версиях пхп. А так оно устарело в районе 5-10 лет, используйте mysqli.
    2) у вас расхождение в вопросе, в скрипте вы смотрите количество строк в ответе, а при при выполнении запроса руками смотрите на результат. Тёплое с мягким не находите?

    3) Ваша проблема в кодировках, а правильный вопрос почему не ищет кириллицу. Ваша проблема скорее всего в неверном character set и collotion на стороне mysql, которые могут быть выставлены на уровне сервера, бд, таблицы и поля (если не определено внизу, то берётся значение сверху). И ещё более вероятно, что вы залили или пишете utf дамп/данные в базу которой кодировка latin или cp1251 (они обе совпадают с utf8 в части латиницы) в этом случае на клиенте всё как бы ок, а кириллицу mysql не понимает.
    Ответ написан
    Комментировать
  • Вычитание и сложение в запросе mysql?

    ruFelix
    @ruFelix
    Предсказание будущего по руке, таро, кофе.
    Хоть я и не очень почему строка/запись названная ячейкой, зачем скобки перед плюсом и что такое цепляться.
    Но ниже приведённый запрос сделает то, что вы хотите.
    SELECT 
    SUM(IF(date = '2016-02-13',0-number1,number1)) as number1,
    SUM(IF(date = '2016-02-13',0-number2,number2)) as number2
     FROM table 
     WHERE `date` IN('2016-02-17','2016-02-15','2016-02-13')
    Ответ написан
  • Как хранить массив элементов в базе данных?

    ruFelix
    @ruFelix
    Предсказание будущего по руке, таро, кофе.
    Если вам не нужно делать выборки по значениям этого массива то сеарилизация уместна.
    Ответ написан
    Комментировать
  • Подобрать базу под задачу проекта?

    ruFelix
    @ruFelix
    Предсказание будущего по руке, таро, кофе.
    1) Забиваете на SQLite и SQL Server, первая не про то, вторая под windows.
    2) как бы вы не спроектировали базу, и что бы вы не выбрали Mysql или Postgres, отличаться будет только запрос на индексацию для сфинкса, который в любом случае будет отдавать вам primary key нужного вам документа, а выборка по PK в любой базе элементарная операция. Кеширование не нужно, сфинкс ваши максимальные 5 000 000 слов даже не заметит.

    на laravel вы видимо будете использовать ORM, поэтому для вас, что postrgers что mysql. Ну разве что mysql более коробочный.
    Ответ написан
  • Как победить cannot allocate memory for the buffer pool в MYSQL?

    ruFelix
    @ruFelix
    Предсказание будущего по руке, таро, кофе.
    у вас буфер innodb_buffer_pool_size=10G а это уже треть памяти

    160109 22:37:20 InnoDB: Initializing buffer pool, size = 10.0G
    InnoDB: mmap(686817280 bytes) failed; errno 12
    и забрать он из не смог
    Вы прям уверенны, что в этот момент никто не занимает память?
    Ответ написан
    5 комментариев
  • Как вытащить последнюю запись из таблицы когда одна запись ссылается на другую в этой же таблице?

    ruFelix
    @ruFelix
    Предсказание будущего по руке, таро, кофе.
    можно, гуглите словосочетания Adjacency list, Matherialized Path, Nested sets, Closure Table не забывая подставлять слово MySQL, найдёте кучу описаний и кучу готовых реализаций.

    Всё названное это оптимизированные варианты хранения деревьев в реляционных БД.
    Ответ написан
    Комментировать
  • Сколько максимум строк можно содержать в таблице без больших потерь скорости выборки из нее?

    ruFelix
    @ruFelix
    Предсказание будущего по руке, таро, кофе.
    Количество не играет роли.
    Играет роль:
    1) Влезают ли индексы в отведённую для них память.
    2) Хватает ли IO на диске для записи данных.
    3) Хватает ли процессора для перестройки индексов.

    Соответственно когда один из этих параметров исчерпывается, производительность проседает.
    Ответ написан
    Комментировать