- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу

Переиграть и победить: как анализировать конкурентов для продвижения сайта
С помощью Ahrefs
Александр Шестаков
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Здравствуйте дорогие друзья :)
Сейчас работаю над проектом который включает в себя mysql таблицы с записями от 2 и более миллиона строк. Малейшая оптимизация и максимально правильные запросы дадут хороший прирост производительности. - поэтому решил обратиться к профессионал и людям с опытом, т.е. к Вам :)
Вопрос 1:
Возможно ли проапдейтить за один запрос большое кол-во строк, с разными ключами.
Сейчас у меня запросы выполняются в цикле так:
UPDATE table SET status=0 WHERE id=3;
UPDATE table SET status=1 WHERE id=70;
UPDATE table SET status=2 WHERE id=53;
UPDATE table SET status=0 WHERE id=50; и т.п.
Возможно ли проапдейтить эти все строки одним запросом?
Вопрос 2 - про вложенные таблицы
Есть две таблицы таблица данных и таблица сопоставлений
Таблица данных Table1 - Id первичный ключ
id | value1 | value2 | value3
Таблица сопоставления Table2 - Id первичный ключ
id | sub_id | value-
Каким оптимальным запросом можно получить 200 случайных строк из таблицы данных table1, при этом этих строк (id этой строки) не должно быть в таблицы сопоставлений table2 (поле sub_id)
Пробовал делать так:
SELECT * FROM table1 WHERE not exists (SELECT id FROM table2 WHERE sub_id=table1.id LIMIT 1) ORDER by RAND() LIMIT 200
Но такой запрос выполняется чудовищно долго :( Гораздо быстрее получить первым запросом и перебрать потом циклом второй.
Заранее спасибо за ваши ответы и комментарии:)
Здравствуйте дорогие друзья :)
Сейчас работаю над проектом который включает в себя mysql таблицы с записями от 2 и более миллиона строк. Малейшая оптимизация и максимально правильные запросы дадут хороший прирост производительности. - поэтому решил обратиться к профессионал и людям с опытом, т.е. к Вам :)
Вопрос 1:
Возможно ли проапдейтить эти все строки одним запросом?
можно конкатенировать и жахнуть одним запросом.
можно prepare($sql) и в цикле разные значения. если поддерэиваются транзакции то делать в одной, будет ощутимо быстрей.
Вопрос 2 - про вложенные таблицы
Есть две таблицы таблица данных и таблица сопоставлений
Таблица данных Table1 - Id первичный ключ
id | value1 | value2 | value3
Таблица сопоставления Table2 - Id первичный ключ
id | sub_id | value-
Каким оптимальным запросом можно получить 200 случайных строк из таблицы данных table1, при этом этих строк (id этой строки) не должно быть в таблицы сопоставлений table2 (поле sub_id)
Пробовал делать так:
SELECT * FROM table1 WHERE not exists (SELECT id FROM table2 WHERE sub_id=table1.id LIMIT 1) ORDER by RAND() LIMIT 200
Но такой запрос выполняется чудовищно долго :( Гораздо быстрее получить первым запросом и перебрать потом циклом второй.
Заранее спасибо за ваши ответы и комментарии:)
select t1.* from table1 t1 left join table2 t2 on t1.id=t2.sub_id where t2.sub_id is null order by rand() limit 200;
По второму вопросу.
Как насчёт вложенных запросов?
SELECT * FROM table1 WHERE id NOT IN (SELECT id FROM table2) ORDER by RAND() LIMIT 200
Незнаю насколько быстрее чем EXISTS, но попробовать стоит.
по первому
UPDATE table SET field = CASE WHEN field1 = 1 THEN 3 WHEN field1 = 2 THEN 4 END WHERE field1 IN (1,2);
Займитесь сначала вторым запросом. order by rand() - плохо в любом виде, как тут не переписывай.
вам нужно переосмыслить что для вас случайные строки. в том виде как у вас, запрос предполагает применение функции rand() к каждой записи, сортировку всего результата и выбор первых 200 значений.
Первый запрос попробуйте скомпоновать так :
replace into table (status,id)
select 0,3
union
select 1,70
union
select 2,53
union
select 0,50;
Но это надо хорошенько упороться, чтобы увидеть тут узкое место. Я в этом сомневаюсь.
Если вы видите такие запросы висящими в show processlist, это еще не значит, что они являются причиной тормозов.
Может они ждут блокировки от другого запроса.
По первым запросам...
Ничего плохого в них нет.
http://www.mysql.ru/docs/man/Update_speed.html
Существует и другой способ произвести операции обновления быстро: задерживать операции обновления, а потом делаеть сразу несколько обновлений. Несколько обновлений подряд выполняются намного быстрее, чем отдельные обновления если вы блокируете таблицу.
По второму запросу...
Уже дали пример классического решения с LEFT JOIN - это, пожалуй, оптимальный вариант. А вот когда лучше делать RAND(), здесь нужно анализ производительности в вашем конкретном случае и рекомендации спецов.
Обычно, лучше сделать RAND() сразу в запросе. Но бывают и исключения, в зависимости от загруженности сервера базы данных. Тогда придётся пожертвовать RAND и:
Золотая середина где-то рядом.