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

    При таких объемах часто применяются всякие денормализации чтобы не было фуллскана, с индексами нужно копаться, запросы иногда писать иначе, может у вас там сотня JOIN в которых связь идет не по ключам, а по простым текстовым полям или еще какие то штуки, при 100к записей незаметно было, а при 500м стало.
    ну и как люди выше написали - профилируйте..

    И еще кстати, если ваш селект возвращает ну к примеру 100 миллионов из ваших 500, то надо лимит применять, там узким местом может быть уже сетевой стек.
    Ответ написан
    Комментировать
  • Mysql + PHP docker скорость?

    @PavelBelyaev Автор вопроса
    Нашел испытания от перконы, реально есть такое как оверхед сетевой, даже если все на одном компе... Мои тесты конечно накладывают еще производительность вычислений, и вероятно у меня с базой не столь много работает сколько обработки, генерация всяких xml... Если бы я только с базой работал, то скорей всего получил аж трехкратное замедление... https://www.percona.com/blog/2016/02/05/measuring-...
    Ответ написан
    Комментировать
  • Как избежать закрытия соединения с БД, если коннект осуществляется из другой библиотеки?

    В самом mysql можно в конфиге прописать wait_timeout большой, но это не совсем выход...
    В том же php есть функция mysqli_ping или что-то такое, у меня тоже скрипт висел месяцами и изредка поймав запрос начинал его обрабатывать работая с бд, естественно коннект отваливался какой бы таймаут не указал, а сильно большие таймауты у сервера ведут к подвисшим соединениям незакрытым, поэтому, в своей программе продумайте такой момент в прослойке к БД, чтобы запоминало время последнего обращения к БД и если оно превышает например 2 минуты, то проверять коннект и если его нет, то переконектить.
    Ответ написан
    Комментировать
  • Очистка скрипта php при обработке изображений?

    Самым простым решением будет SQL_CALC_FOUND_ROWS + LIMIT, например, LIMIT 0 10 (c нулевой строки и получить 10), а дальше узнаете сколько там нашлось записей до лимита через запрос
    SELECT FOUND_ROWS()
    узнаем сколько там записей, хотя проще COUNT(*) получить, если вы тупо все записи хватаете без выборки по условияю (обработан или нет).

    Смысл в том, что вы должны из базы брать например по 10 записей, обрабатывать, а потом следующие 10, например
    LIMIT 10 10
    LIMIT 20 10
    LIMIT 30 10
    небольшой пачкой брать по 10 записей, обрабатывать и потом следующие 10, зная сколько всего записей итерацию сделайте типа как постраничный вывод товаров, посмотрите как постраничная навигация делается на сайтах, так и делайте
    Ответ написан
    Комментировать
  • Почему при LIMIT 5 изменяется больше строк?

    Лимит вроде как только для select, чтобы ограничить вывод, организовать постраничный вывод...
    Попробуйте что-то вроде
    UPDATE ....
    WHERE 
    `id` IN (
    SELECT `id` FROM (
        SELECT `id` LIMIT 5
    ) as `t`
    
    )


    Вложенный двойной SELECT чтобы обойти ограничение типа нельзя изменять выбираемые данные...
    Ответ написан
    1 комментарий
  • Можно ли менять данные в mysql с подтвержением?

    На php в mysqli есть функция (метод) affected_rows, она вернет сколько записей затронуто, тоже самое, что происходит в phpmyadmin.

    Можно добавить поле last_modified, например, в нем прописать on update timestamp, ну и из списка обновленных товаров выгружать с выборкой по таймштампу, естественно, если оно обновилось после формирования запроса, то в базе будет timestamp больше или равен текущему, в таком случае можете не только количество обновленных знать, но и конкретно знать какие строки обновлены, а какие такими и остались...

    Если же вы желаете подтверждать обновление данных средствами своей программы, то нужно сделать так - получаем все записи нужные у которых эти поля на данный момент не равны тому, что вы желаете в них записать и из этого результата пройтись и подтвердить, а потом выполнить запрос, передав например нужные ID только на UPDATE
    UPDATE `table` SET `field`=1 WHERE `id` IN (1,2,3,4,5,22)
    Ответ написан
    Комментировать
  • Как сделать доступ к сайту без возможности копирования?

    Наверно надо ему ftp доступ дать к тестовому серверу, где он только папку с шаблонами будет видеть, ну и на лету обновлять, тестировать....
    Ответ написан
    Комментировать
  • Как установить часовой пояс в mysql?

    при подключении к БД
    SET @@session.time_zone = "+00:00";
    Ответ написан
    Комментировать
  • Как подсчитать количество врачей, работающих в неделю?

    SELECT COUNT(doctors.id) AS total_doctors, doctors.speciality
    JOIN holidays ON holidays.doctor_id = doctors.id AND (holidays.start_date > inputInterval.end_date OR holidays.end_date < inputInterval.start_date)
    Ответ написан
    2 комментария
  • Постраничная навигация php + Mysql?

    <?echo $row['id'];?> можно заменить на более короткий вариант
    <?=$row['id'];?>

    Для постранички используйте LIMIT в запросе, а чтобы определить сколько записей до лимита - пользуйтесь SQL_CALC_FOUND_ROWS
    Ответ написан
    Комментировать
  • Вывод данных MySQL по имени. Как реализовать?

    Во первых не забывайте про фильтрацию поступаемых данных из GET, ну и строковые значения в кавычки засуньте, а названия полей в косые.

    $guild = mysql_query ('SELECT * FROM clan_members WHERE name='.$myrow['username'].'');


    типа так
    $guild = mysql_query ("SELECT * FROM clan_members WHERE `name`='".$myrow['username']."'");


    Во вторых, ну

    //тут надо обрезать $_GET['user'], оставив только [0-9]+
    
    //нужно еще проверить существование ячейки в массиве
    if(isset($_GET['user']) && $_GET['user']>=0){
     
    
      $sql = "SELECT 
      `authme`.`realname`, 
      `authme`.`world`, 
      `authme`.`isLogged`,
      `authme`.`access`,
      `clan_members`.`clan`
      FROM `authme`
      LEFT JOIN `clan_members` ON `clan_members`.`name`=`authme`.`username`
      WHERE `authme`.`id`=".$_GET['user'];
    
      $result = mysql_query($sql);
      $myrow = mysql_fetch_array ($result);
    
      unset($result,$sql); //подчищаем лишнее
    
    
    
      $tpl->get_tpl('template/Default/user.tpl');
      $tpl->set_value('USERNAME', $myrow['realname']);
      $tpl->set_value('WORLD', $myrow['world']);
      if($myrow['isLogged'] == 1){
        $tpl->set_value('ONLINE', '<font color="green">В игре!</font>');
      }else{
        $tpl->set_value('ONLINE', '<font color="red">Вне игры!</font>');
      }
      if($myrow['access'] == 1){
        $tpl->set_value('ACCESS', '<font color="red">Администратор</font>');
      }else{
        $tpl->set_value('ACCESS', '<font color="gray">Игрок</font>');
      }
      if($myrow['clan']){
        $tpl->set_value('GUILD', $myrow['clan']);
      }else{
        $tpl->set_value('GUILD', 'Не состоит в гильдии');
      }
    }else{
      echo 'Пользователь не выбран';
    }


    Можно еще конечно спорить про структуру базы, про текстовые ключи, которые лучше на числовые индексы заменить.
    Ответ написан
    Комментировать
  • Как сделать отказоустойчивый mysql?

    Погуглите про репликацию БД, а еще есть Percona XtraDB Cluster, на хабре писали про всё это несколько раз.
    Ответ написан
    1 комментарий
  • Как оптимизировать базу данных?

    1. не заметил
    2. на размер влияет заполненность записей, но место высвобождается не сразу.

    А вообще выключайте кеширование запросов и тестируйте скорость отдачи, можете еще скриптиком заполнить 200 тыс записей, чтобы сильнее ощутить какую то разницу.
    Ответ написан
    Комментировать