Ответы пользователя по тегу MySQL
  • MySQL, оптимизация запроса

    @edogs
    1) Переверните джоин, джоиньте к B таблицу A, а не наоборот. В среднем лучше джоинить меньшее к большему, к тому же это позволит без напряга фильтровать по b.published.
    2) Храните количество картинок отдельным полем в games, ну и a.small заодно если он так уж нужен (хотя его можно и выбирать в принципе, если правильно это сделать). Это позволит на таких запросах вообще обходится без джоина. Это же стандарт, количество постов хранить в таблице с темами, количество тем в таблице с форумами, соответственно количество картинок в таблице с играми...
    Ответ написан
    7 комментариев
  • Парсинг XML файла средствами MySQL

    @edogs
    поменять ее нельзя, это API со стороннего сервиса
    load xml — берет файл с локальной ФС, что мешает (тем или иным образом) обработать хмл (пусть даже в консоли регуляркой вырезав все ненужные item)?
    Получили файл от АПИ, обработали, залили в мускул.

    возможно-ли сделать в рамках такого запроса удаление из БД тех записей, id которых не найдены в файле XML?
    Напрямую никак. Можно импортнуть данные из ХМЛ во временную таблицу и на основе появившихся ИД — снести из основной все лишнее (delete from table main where id not in (select from table tempforxml))

    Вопрос обстоит в том, каким образом можно получить данные из item_1 которые находятся в атрибуте img. Когда я создаю в таблице поле с именем «img», туда парсятся данные из атрибута последнего тега item, и дублирования имен полей в MySQL не допустимо, а имена атрибутов поменять нельзя. Если кто знает, как еще можно обратиться к атрибуту через LOAD XML, просьба подсказать.
    Напрямую нельзя. Народ извращается с load data infile с последующей работой с xml в базе, по типу такого newtover.tumblr.com/post/14858246616/mysql-load-data-from-xml. Но вряд ли это будет эффективный способ.
    Ответ написан
    Комментировать
  • Поиск телефона в базе

    @edogs
    А в чем конкретно проблема?
    В БД формат известен.
    Юзер вбивает только цифры.
    Вбил юзер 84951234567 — конвертните это в 7 (495) 123-45-67 и ищите.
    Ответ написан
    Комментировать
  • Бекап mysql ложит сайт на несколько минут?

    @edogs
    Не вполне понятна изначальная задача. Сделать бакап? Или что бы не падал от mysqldump-а?
    Просто кроме mysqldump-а в первом случае можно посоветовать
    а) sypex dumper
    или
    б) mysqlhotcopy
    Ответ написан
  • Копирование большого объёма данных из одной таблицы в другую

    @edogs
    Доступ к ФС есть?
    Если да. то
    а) Можно скопировать файлы баз данных (myd,frm,myi), предварительно остановив БД.
    б) Можно воспользоваться mysqlhotcopy (делает почти то же что пункт А, только умнее и не останавливая всю БД).

    p.s.: Если данные из одной таблицы в другую надо именно добавлять, тогда вышеописанное годится для «выброса» данных из рабочей таблицы во временную, что бы рабочая уже дальше работала пока идет долгое копирование через insert into
    Ответ написан
    Комментировать
  • Составить запрос для получения таблицы рейтинга

    @edogs
    Хрестоматийный пример того, когда наворачивать НЕ нужно.
    winGame — количество выигранных игр (resultGame = 3),
    drawGame — количество игр в ничью (resultGame = 2 OR =4 OR =5 OR =6),
    loseGame — количество проигранных игр (resultGame = 2 OR =4 OR =5 OR =6),
    startGame — количество незаконченных игры (resultGame = 0),
    allGame — количество всех игр (resultGame NOT IS NULL),
    и еще куча полей

    Это все обновляется только при завершении/начале игры, добавляйте эти поля в основную таблицу и апдейтите ее во время завершения/начала игры. Да и последнее время активности пользователя и другие еще можно. Не надо выбирать их динамически.
    В таком случае и такие вещи как «позиция в рейтинге» будут выбираться тоже простым запросом, а не этим хитро*ным (простите, другого слово тут не подобрать).
    Ответ написан
  • VBulletin 5.0.2 вместо кириллицы знаки вопроса

    @edogs
    В четвертой версии данная проблема решалась добавлением
    mysql_query («set character_set_client='utf8'»);
    mysql_query («set character_set_results='utf8'»);
    mysql_query («set collation_connection='utf8_general_ci'»);
    Не знаем как в 5-той, но в 4-той, равно как и в 3-ей версии по правильному это решалось не добавлением тех 3 строк, а раскомментом includes/config.php строчки
    $config['Mysqli']['charset'] = 'utf8';

    В базе все отлично, ну по крайней мере в phpmyadmin все отлично просматривается.
    А phpmyadmin какое соединение с базой по умолчанию имеет? Если просто скрипт сделать для чистоты эксперимента, который берет из базы запись, устанавливая и/или не устанавливая чарсет — проблема где будет?
    Ответ написан
  • Как выбрать суммы с группировкой по дате?

    @edogs
    Если дат далеко не одна, то можно так
    select 
    `sum( if( `date`<'2012-01-01',sum20120101,0) ) as sum20120101 ,
    `sum( if( `date`<'2012-01-02',sum20120102,0) ) as sum20120102 
    from table
    where `date`<'2012-01-02'
    
    Ответ написан
    3 комментария
  • MySQL запрос или вина хостера. Кто прав?

    @edogs
    Дело в том, что когда работает скрипт search.php ( а это около 8-ми секунд ) — то остальные страницы с сайта, если их попробовать загрузить — сразу не отдаются. Отдаются только когда скрипт search.php начинает отдавать контент в браузер…
    — +
    — Вопрос: если пока работает скрипт search.php попробовать открыть другую страницу в ДРУГОМ браузере — они будут отдаваться?
    Ответ написан
    5 комментариев
  • Исключение определённых ID с условием ИЛИ работает некорректно?

    @edogs
    Одна из тех ситуаций, когда M2M не айс.

    Делайте exclude грубо говоря
    SELECT `movies`.* FROM `movies` 
    INNER JOIN `movie_genres` ON `movie_genres`.`movie_id` = `movies`.`id` 
    WHERE movies.id not in 
    (
    select movies.id from movies left join movie_genres on movies.id=movie_genres.movie_id 
    where movie_genres.genre_id in (10,12)
    )
    GROUP BY `movies`.`id`;
    
    Ответ написан
    3 комментария
  • Хранить и считать время круга

    @edogs
    Хранить в int
    Вычислять как 1:44.912=1000*60*1+1000*44+912 и соответственно наоборот.
    Разница и среднее и прочее — высчитывается очень просто.
    Ответ написан
    1 комментарий
  • Что лучше: очередь запросов или один, но большой?

    @edogs
    Один запрос.
    Это самый распространенный (и к счастью самый легко устраняемый косяк), когда делают нечто вроде foreach() mysql_query; что при всего-то даже при 100 элементах массива дает результатом 100 запросов. Жуть страх и трепет.
    Ответ написан
    1 комментарий
  • Нужна помощь в оптимизации SQL запроса

    @edogs
    Зачем здесь вообще join если Вы выбираете только m.id который у Вас равен s.movie? Для того что бы выбрать фильмы без расписания тоже? Имхо из-за этого могут получиться избыточные данные.

    select count(*), movie from schedule where date>'2012-11-01' and date<='2012-11-02' order by count(*) desc limit 10
    Так Вы выберите все фильмы с расписанием. А потом тупо дополните их запросом к movies что бы выбрать все фильмы вообще и выкините из них результаты первого запроса. Сумма и будет нужным результатом.
    Ответ написан
    Комментировать
  • Долгое выполнение запросов в MySQL

    @edogs
    Попробуйте повесить составной индекс на checked,taken или даже на task_id, checked,taken
    а запрос можно попробовать поменять на запрос вида
    select task_id from tasks_pending where checked=0 and taken=0 group by task_id limit 50;
    Ответ написан
    6 комментариев
  • Cоздать правильный запрос MySQL?

    @edogs
    Вам бы php/mysql программера в команду. Без обид, но если _такого_ уровня вопросы возникают, то поверьте — косяков в _сложном_ проекте Вы наделаете навалом.

    По сути вопроса: нечто вроде такого
    update wp_posts set post_type='page' where post_type='post' and post_date in (select `created` from jost_content where catid<.16)
    Ответ написан
  • Что использовать при кешировании запросов MySQL в PHP

    @edogs
    Одна из главных — сброс кеша при любом изменении таблицы — это критично, так как разрабатываемая система многопользовательская. Я уже задумывался, чтобы хранить результаты тяжелых запросов в файлах на сервере и при очередном выполнении запроса (с привязкой к пользователю системы) проверять, если уже такой запрос был, то брать из файла. Но в этом случае придется решать проблему именно отслеживания изменений в таблице.
    — Получается немного нелогично. С одной стороны Вас беспокоит сброс кэша при любом изменении таблицы, с другой стороны Вы говорите что на кэш изменения в таблице влияют и их надо отслеживать.

    Один из относительно легких вариантов для кэша, это memory таблица в mysql, куда складируются либо все данные которые часто выбираются либо ИД для их выбора из основных таблиц. Плюс по сравнению с 3rd-party решением тут то, что закэшить можно не прогоняя лишние данные через php и сеть, просто insert into select from — в большинстве случаев. Это во-первых. А во-вторых, триггерами при изменениях основной таблицы можно настроить апдейт кэширующей, более гибко чем просто тупой кэш запросов.
    Ну и наконец если база относительно небольшая, то innodb + большой размер пула/кэша — тогда вообще все в памяти будет постоянно считай.
    Ответ написан
    3 комментария
  • Кто тестировал Оператор IN в MySQL? Насколько он быстр и есть ли альтернативы?

    @edogs
    Подойдите к проблеме с чуть более раннего места.
    Откуда берется массив? Из базы? Тогда может больше смысла подумать о сложном запросе?
    Или можно массив во временную таблицу загнать и ссылаться на нее.
    Ответ написан
    Комментировать
  • Как работать с большими БД для web-проектов?

    @edogs
    индексов нет
    Поставьте индексы.
    Ваш К.О.
    Ответ написан
    Комментировать
  • Select/where/group by на 100m-200m таблицах?

    @edogs
    Ответ не совсем в тему.
    Но поскольку запрос у Вас как бы совсем не noSQL-ный, и индексы занимают много места… возможно есть смысл или тупо округлить время до минут (индексы сразу займут раз в 60 меньше места), или ввести доп. поле с временем округленным до минут (таблица подраздуется, но индексы будут меньше).
    Ответ написан
    Комментировать
  • Простой вопрос по Mysql?

    @edogs
    Есть так же вариант с view
    Нечто вроде
    CREATE VIEW tablemultiple AS SELECT id, part, usd, quantity, quantity*usd as Total_in_USD from a37a
    Ответ написан
    Комментировать