Ответы пользователя по тегу MySQL
  • Таблица связей. Выбор значений object_id, option_id которых равны одновременно нескольким значениям

    @egorinsk
    SELECt fields FROM table WHERE option_id IN (1,2) UNION SELECT fields FROM table WHERE object_id IN (1,2)

    Такой подход позволит использовать индексы (если они есть) вместо перебора всех строк таблицы (при использовании OR)
    Ответ написан
  • Книга по php/mysql

    @egorinsk
    Как всегда в таких случаях, рекомендую php.net/manual
    Ответ написан
  • Влияние типа поля на быстродействие индекса. MySQL?

    @egorinsk
    Подозреваю, дело в том, что VARCHAR и TEXT данные хранятся разным способом:

    > For BLOB and TEXT data, the information is stored internally in a different area of memory than the row buffer.

    dev.mysql.com/doc/refman/5.0/en/storage-requirements.html
    Ответ написан
    2 комментария
  • CMS своими руками

    @egorinsk
    Автор, а что гуглить. Есть минимум 3 способа: расковырять простую Open-Source CMS (проблема: найти CMS с хорошей архитектурой и аккуратным кодом), устроиться в компанию, у которой есть своя CMS (а она есть почти у каждой студии), и наконец, написать самому правильно.

    Маны нужны не по написанию CMS, а по используемым продуктам и технологиям.

    Сначала надо определиться с задачей. Установите и попользуйтесь несколькими CMS, просто чтобы увидеть особенности их работы. (если вы не можете это сделать — вам надо изучать основы установки и настройки apache/mysql/whatever, а не CMS писать. Уходите практиковать эти навыки). Также, есть хороший сайт, где установлены демки десятков CMS и можно их посмотреть, не устанавливая.

    Запишите, что вы хотите получить, сделайте наброски страниц. Определитесь с требованиями к вашей CMS. Какие в ней будут модули, как ими можно управлять.

    CMS обычно состоит из 2 частей — т.н. «админки» (запароленный раздел, где меняется конфигурация сайта, добавляются материалы) и публичной части сайта, которую видят пользователи.

    Если вы еще не бросили эту затею, перейдем к следующему пункту. Проектирование архитектуры и написание CMS. Чтобы хорошо писать сложную CMS, нужен опыт и понимание того, как вообще писать сложные программы. Нужно глубокое знание HTTP/HTML/CSS/JS/SQL. А именно:

    — система должна быть модульной, чтобы, написав основу, можно было, не переписывая ее, не спеша добавлять модули и расширять функционал
    — система должна писаться с использованием грамотной архитектуры и аккуратного кода, так как поддержка и переписывание плохого кода будет отнимать у вас слишком много сил. А потом в нем вообще никто не сможет разобраться.

    Что еще надо знать. Во-первых, надо иметь представление что значит MVC или 3-звенная архитектура.

    M в MVC — это Model. CMS скорее всего будет хранить данные в БД — надо знать, что такое и как пишется DBAL (гуглите: PDO), плейсхолдеры в запросах, возможно, Table Gateway, ознакомиться с тем, что такое ORM, и почему PHP-ные ORM так тормозят. Если будете делать модельки, не храните значения полей в публичных свойствах — это неудобно и нарушает инкапсуляцию. Храните их в приватном массиве $attributes.

    V is for View. Надо знать, что такое шаблонизаторы (прочтите мануал по Smarty, Django Templates, HAML и XSLT, чтобы иметь общее представление, какие они бывают). Для PHP хорошие варианты — использовать чистый PHP или XSLT, если осилите. Smarty — устаревший тормозной хлам, Twig тоже имеет недостатки. И не стоит ставить шаблонизатор, только, чтобы писать {$a} вместо [?= $a =].

    Не смешивайте логику (сложные вычисления, обращение к БД) и шаблонизацию. Лучше сделайте 2 файла: один с кодом, другой с шаблоном. В идеале, шаблонизатор получает от контроллера значения переменных и, кроме хелперов, никакого другого кода не вызывает.

    C — контроллеры. Но это самая простая часть, контроллер — это просто класс с методами типа viewAction(), editAction() и роутер, который смотрит на УРЛ и вызывает нужный контроллер. Посмотрите, как устроен Zend_Controller и Zend_Front_Contriller, и сделайте так же, но попроще. выкинув 90% функционала — он вам не понадобится.

    Нужно как-то сделать систему компонентной без сильных связей: чтобы ядро могло работать и без модулей, а добавление модуля не требовало дописывания кода в ядро. Почитайте про Dependency Injection, а также Observer (observer — это когда мы делаем функцию addEventListener()).

    Не используйте хуки, как в Друпал. Это дурной и порочный путь, взятый видимо из древных времен и программирования на Си.

    Что еще. Освоив все эти понятия, у вас в принципе не будет сложностей написать CMS, но почитайте еще мои советы по тому, как писать правильный код с исп. ООП: habrahabr.ru/qa/17158/#answer_70869

    Написание своих велосипедов, в общем, полезно и способствует расширению кругозора разработчика, заставляет его изучать разные подходы к написанию кода.

    Ну что еще. Если (в чем я сильно сомневаюсь) благодаря моему скромного совету вы все же сможете пройти этот нелегкий путь и станете успешным разработчиком, можете заплатить мне денег. Я не против.
    Ответ написан
    Комментировать
  • Как выполнить mysql запрос в php не дожидаясь его окончания?

    @egorinsk
    system('nohup script.php&') — что-то вроде этого, но это раюотает только в linux и создает лишнюю фоновую задачу нагрузку на БД.
    Ответ написан
    2 комментария
  • Оптимальная реализация поиска и сортировки объектов с фиксированным количеством полей?

    @egorinsk
    Ха, делаете поиск по пользователям в очередной недосоциальной сети или сайте знакомств? ну-ну, на майскуле с кучей индексов ваш поиск будет работать ровно до 10 000 пользователей. Вообще, стоило бы сначала изучить, какие параметры используют чаще для поиска, и делать индексы по ним.

    С ростом числа юзеров, как вариант костыля на первое время, можно попробовать прикрутить сфинкс или какой-нибудь Lucene, но с ростом нагрузки все равно этот функционал придется выносить в отдельный кастомный модуль. Спросите у вконтактеров, например, как у них сделан поиск по людям (отдельным модулем на Си).
    Ответ написан
  • Авторизация, сессии (php, mysql)?

    @egorinsk
    Лучше всего вам разобраться как например сделаны сессии в том же PHP по умолчанию. Касательно вопроса (session_id хранится в куках, его можно подменить) — а вы делайте этоот session_id из 32-64 букв, знаков и цифр. Подменить-то такой ид можно, но сначала надо его подобрать, а это годы работу суперкомпьюетров.
    Ответ написан
  • MySQL: Узнать количество "пройденных" SELECT`ом строк

    @egorinsk
    > И есть простенький запрос:
    > SELECT * FROM `mytable` WHERE `system_name` = 'element_10' ORDER BY `id`

    > Как получить количество (именно количество, содержимое не важно) строк, которые команда «прошла» до того как получила результат?

    Ваш вопрос некорректен. Вы думаете, MySQL всегда передирает все строки подряд? Если бы на поле system_name был индекс, MySQL выбрала бы эту строчку с первого раза, не проходя другие.

    Наверно, вы хотели спросить, как посчитать, сколько существует строк, у которых id меньше чем у найденной? Это можно сделат запросом

    SELECT COUNT(*) FROM mytable WHERE id < {id найденной строки}

    Этот запрос неэффективен, особенно на больших таблицах, потому в случае потребности в нем (например, надо считать на каком месте игрок с заданным числом очков) делают дополнительное поле position, и крон скриптом раз в N минут пересчитывают места. Процесс пересчета можно как-то оптимизировать, сохраняя информацию о вставках и удалениях в таблице.
    Ответ написан
    Комментировать
  • SELECT WHERE IN: Подскажите оптимальный вариант взаимодействия PHP - MySQL

    @egorinsk
    Если выбрать второй вариант, нельзя будет сделать дешевую оптимизацию разнесением таблиц на разные сервера. То есть в этом случае с ростом нагрузки придется покупать массивы дисков, многопроцессорные ядра и прочую хрень. А потом ломать руки архитектору и переписывать весь код.

    А в первом случае банально разносим таблицы по серверам и еще годик бездельничаем.

    Также, с первым вариантом, сущности можно дергать частично из кеша мультизапросом. А второй вариант хрен закешируешь.

    Так что не слушайте джойнеров, потом жалеть будете.
    Ответ написан
    6 комментариев
  • Перемещение данных и группирование?

    @egorinsk
    Если надо запретить создание товаров с одинаковыми именами, надо сделать UNIQUE INDEX по полю name_goods. Чтобы индекс не стал огромным уродливым тормозящим монстром, его надо объявлять примерно так (ограничить размер индексируемой подстроки):

    ALTER TABLE im_goods ADD UNIQUE INDEX ix_name ( name_goods(10) );

    Тогда БД не позволит вам вставлять 2 товара с одинаковым названием (смотрите, чтобы это не было потом сюрпризом).

    Хотя, может, я вас не так понял.

    P.S. Советую также в следующий раз правильно называть поля, чтобы не коробило глаза понимающих английский: товар = product, название = product_name, ид товара = product_id, рубрика = category. Вдруг будете для американцев например делать магазин, пригодится.
    Ответ написан
  • mysql_connect() всегда пытается соедениться с локальным хостом

    @egorinsk
    Посмотрите, через strace/netstat (если вы на уиндоуз, то через procmon/procexp) куда на самом деле коннектится PHP и что происходит перед этим, например, пытается ли он отрезолвить имя сервера.
    Ответ написан
    Комментировать
  • Счетчики элементов большой древовидной структуры?

    @egorinsk
    Еще, если речь об интернет-магазине, можно кешировать число товаров в каждой категории, или кроном раз в 5 минут пересчитывать и сохранять (через запрос SELECT COUNT(*) GROUP BY category_id), но мне подход L0NGMAN нравится больше.

    > Была попытка реализовать на mysql-триггерах обновление счетчика каждой категории при изменении/добавлении/удалении товара, но при загрузке большого количества товара такая система работает крайне не стабильно, точнее долго.

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

    @egorinsk
    На эту тему (как обновлять структуру больших таблиц MySQL на живом сервере) в прошлом году была статья на Хабре — вроде бы перевод кого-то из фейсбука — можете поискать. Там какие-то хитрые манипуляции с триггерами, а также копированием и переименованием таблиц. Но в общем предлагаемый метод похож на описанный вами.

    > Если просто попробовать выставить индексы через ALTER TABLE то я боюсь что у меня сервер повиснет в процессе.

    Так и будет. Это очень медленная операция, на огромных таблицах она займет часы или даже дни.
    Ответ написан
    Комментировать
  • Используются ли в update запросах mysql индексы?

    @egorinsk
    Сделайте InnoDB таблицу из 10 млн записей и сравните например скорость SELECT по индексу/без и скорость UPDATE. Подозреваю, что при выборке участвуют, так как UPDATE предполагает в начале выборку изменяемых строк.
    Ответ написан
  • MySQL и память

    @egorinsk
    Проверьте число макс. соединений и потоков (процессов на линуксе) MySQL. Сами понимаете, что каждый из требует память.

    Проверьте выставленные значения key_buffer_size (исп. MyISAM, один буфер на все потоки), thread_stack (стек нужен каждому потоку), net_buffer_length (свой у каждого потока), read_buffer_size (у каждог опотока свой), read_rnd_buffer_size, sort_buffer, pool_buffer_size, как вам выше написали.

    Вообще, MySQL довольно предсказуемая система и ест столько памяти, сколько ей скажут. Ссылочка dev.mysql.com/doc/refman/5.0/en/memory-use.html вам в помощь.

    Перестаньте пользоваться нехорошему вещами, вроде JOIN или fulltable row scan на больших таблицах. Они все тоже едят память, да еще как.
    Ответ написан
    Комментировать