powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите исправить простой запрос
56 сообщений из 56, показаны все 3 страниц
Помогите исправить простой запрос
    #38477622
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Выбираются все темы форума из таблицы тем, а так же количество сообщений в этих темах из таблицы сообщений, и еще нужно выбрать имя автора самого нового сообщения в каждой теме, это я не знаю как сделать, у меня выбирается имя автора самого старого сообщения. Подскажите

Код: sql
1.
SELECT topics.*, count(messages.text) as count, messages.nik FROM `messages` right JOIN `topics` ON messages.parent=topics.key GROUP BY topics.key, topics.datetime 
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38477635
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38477640
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, сам уже посмотрел!
Так сделал:

Код: sql
1.
2.
3.
4.
5.
SELECT topics . * , count( messages.text ) AS count, SUBSTR( min( CONCAT( messages.datetime, messages.nik ) ) , 20 ) 
FROM `messages` 
RIGHT JOIN `topics` ON messages.parent = topics.key
GROUP BY topics.key, topics.datetime
LIMIT 0 , 30
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38477715
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще один вопрос:
Почему так не работает?
Код: sql
1.
SELECT * FROM topics right JOIN messages ON messages.parent = topics.key as t1, (SELECT max(CHAR_LENGTH(topics.title)) FROM topics) as t2

выдает ошибку
Код: sql
1.
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'as t1, (SELECT max(CHAR_LENGTH(topics.title)) FROM topics) as t2' at line 1


А так работает:
Код: sql
1.
SELECT * FROM topics right JOIN messages ON messages.parent = topics.key



И так тоже работает:
Код: sql
1.
SELECT * FROM topics as t1, (SELECT max(CHAR_LENGTH(topics.title)) FROM topics) as t2
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38477743
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правильно не работает.... ты чё пытаешься алиасить-то?
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38477968
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ага, разобрался
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38482794
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще вопрос. Вот такой запрос:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT
	topics.nik,
	topics.datetime,
	topics.title,
	count( messages2.text ) count,
	SUBSTR( max( CONCAT( messages2.datetime, messages2.nik ) ) , 20 ) lastnik
FROM `topics`
JOIN `messages` ON messages.parent = topics.key
	AND messages.nik = 'Admin'
JOIN `messages` as messages2 ON messages2.parent = topics.key
GROUP BY topics.key
ORDER BY topics.datetime DESC 
LIMIT 40




Мне нужно выбрать темы из таблицы тем, при условии что существуют сообщения в этих темах в таблице сообщений, у которых автор - конкретный пользователь. Я это сделал через join таблицы тем с таблицей сообщений ограниченной по нику пользователя.
Но еще нужно посчитать сколько всего сообщений в этих темах, от всех пользователей, я это сделал через второй join с таблицей сообщений. Но результат получается не правильный - количество сообщений считается с возведением в квадрат количества сообщений от каждого пользователя.
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38482803
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D_Pavel,

разделите два посчета, например так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
select
  (select count( messages2.text ) from `messages` as messages2 where messages2.parent = zz.key) count
  zz.*
FROM 
(
SELECT
	topics.nik,
	topics.datetime,
	topics.title,
	SUBSTR( max( CONCAT( messages2.datetime, messages2.nik ) ) , 20 ) lastnik
FROM `topics`
JOIN `messages` ON messages.parent = topics.key
	AND messages.nik = 'Admin'
GROUP BY topics.key
ORDER BY topics.datetime DESC 
LIMIT 40
) zz
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38482817
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо!
Сделал по аналогии так, но мне кажется что это не оптимально, присутствуют одинаковые выборки:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
select
	( select
		count( messages2.text )
	from `messages` as messages2 where messages2.parent = zz.key) count,
	( select
		SUBSTR( max( CONCAT( messages2.datetime, messages2.nik ) ) , 20 )
	from `messages` as messages2 where messages2.parent = zz.key) lastnik,
	zz.*
FROM 
(
SELECT
	topics.key,
	t2.lentitle,
	topics.nik ts,
	topics.datetime topicdate,
	topics.title
FROM `topics`
JOIN `messages` ON messages.parent = topics.key
	AND messages.nik = 'Admin',
(
	SELECT max( CHAR_LENGTH( title ) ) lentitle
	FROM topics
) AS t2
GROUP BY topics.key
ORDER BY topics.datetime DESC 
LIMIT 40)zz



Возможно оптимизировать быстродействие или упростить запрос?
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38482819
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И еще у меня в этом запросе не правильно считает lentitle - длинна самого длинного заголовка из выбранных, почему-то просматривает всю таблицу тем, а не отсеянные темы.
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38482821
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Последнюю ошибку вот так исправил, но кажется запрос стал еще неоптимальнее:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
select
	( select
		count( messages2.text )
	from `messages` as messages2 where messages2.parent = zz.key) count,
	( select
		SUBSTR( max( CONCAT( messages2.datetime, messages2.nik ) ) , 20 )
	from `messages` as messages2 where messages2.parent = zz.key) lastnik,
	zz.*
FROM 
(
SELECT
	topics.key,
	t2.lentitle,
	topics.nik ts,
	topics.datetime topicdate,
	topics.title
FROM `topics`
JOIN `messages` ON messages.parent = topics.key
	AND messages.nik = 'Admin',
(
	SELECT max( CHAR_LENGTH( title ) ) lentitle
	FROM topics JOIN `messages` ON messages.parent = topics.key
	AND messages.nik = 'Admin'
) AS t2
GROUP BY topics.key
ORDER BY topics.datetime DESC 
LIMIT 40)zz
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38482837
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D_Pavel,

оптимальный-нешоптимальный... таких слов не бывает.

запрос должен , в порядке значимости:

1. выдавать правильный результат
2. быть в пределах скорости указаных в техзадании
3. не грузить сервер
4. быть более-менее понятным автору через 3 месяца
5. вызывать естетическое удоволъствие у эстетов скл.ру

P.S. вместо выполнения пунктов 4 и 5 можно пойти пить пиво
и играть в преферансе... или с женшинами...
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38482850
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
То есть если мой запрос по два раза выбирает одни и те же данные и укладывается в нужное время, то оставить все как есть?
Он даже у меня не вызывает эстетического удовольствия.
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38482937
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пробую по частям.
Код: sql
1.
2.
3.
4.
5.
SELECT *
FROM topics
JOIN messages ON
 messages.parent = topics.key
 AND messages.nik = 'Admin'



Как в этот запрос вставить подсчет длины самой длинной строки title ?

Код: sql
1.
max( CHAR_LENGTH( title ) ) lentitle 
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38482971
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Даже еще упростил, все равно не понятно:

Код: sql
1.
2.
SELECT table.text 
FROM table 


Нужно добавить вычисление длины самой длинной выбранной строки.

Код: sql
1.
max( CHAR_LENGTH( table.text ) ) 
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38482988
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D_PavelВыбираются все темы форума из таблицы тем, а так же количество сообщений в этих темах из таблицы сообщений, и еще нужно выбрать имя автора самого нового сообщения в каждой теме http://sqlfiddle.com/#!2/7a15a/1
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select * 
from topics t
left join 
  (
    select m.parent, COUNT(*) qty, MAX(m.KEY) msg
    from messages m
    group by m.parent
  ) q 
  join messages m on m.KEY=q.msg
  on q.parent=t.KEY;
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38482991
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38483019
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D_PavelЕще вопрос.

Мне нужно выбрать темы из таблицы тем, при условии что существуют сообщения в этих темах в таблице сообщений, у которых автор - конкретный пользователь.
Но еще нужно посчитать сколько всего сообщений в этих темах, от всех пользователей http://sqlfiddle.com/#!2/71133/2
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38483029
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
у тебя получается условие по nik из таблицы topics, а должно быть по nik из таблицы messages. То есть выборка topics с участием nik в messages, не важно кто автор в topics.
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38483050
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D_Pavelу тебя получается условие по nik из таблицы topics, а должно быть по nik из таблицы messages. То есть выборка topics с участием nik в messages, не важно кто автор в topics.Сорь, не понял сразу.
FIX: http://sqlfiddle.com/#!9/894fc/1
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select t.*, count(*) qty
from 
  (
    select m.parent
    from messages m
    where m.usr='adm'
    group by m.parent
  ) p
join topics t on t.key=p.parent
join messages m on m.parent=t.key
group by t.key
;
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38483114
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, классный запрос
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38483639
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Собрал все вместе, немного допилил, получилось так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
set @max=0;
select *, @max:=IF(tmp.lentitle>@max, tmp.lentitle, @max) as maxlentitle from (
	SELECT
		*,
		CHAR_LENGTH(topics.title) as lentitle,
		(SELECT CONCAT( count( text ), '	', max( CONCAT( datetime, '	', nik ) ) ) 
			FROM messages
			WHERE parent = topics.key
		)count_lastnik
	FROM topics
	where topics.key in
		(SELECT parent
			FROM messages
			WHERE messages.nik = 'Admin'
			GROUP BY parent
		)
) as tmp



lentitle буду получать из последней строки результата запроса.
Все верно получилось? Может что-то не нормально? Я новичок, не знаю возможностей MySQL, поэтому могу что-то написать очень глупое, поправьте пожалуйста.
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38483690
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D_PavelТо есть если мой запрос по два раза выбирает одни и те же данные и укладывается в нужное время, то оставить все как есть?
Он даже у меня не вызывает эстетического удовольствия.

в жизни должны быть приоритеты.
Для програмиста -- эстетика кода вполне
важна, но на 5-ом месте (примерно по приведеному списку).

Без пункта #2 и #3 говорить об естетике просто рано.
Укажите имеюшуюся скорость, какие обьемы есть или
как ожидаются, какие требования к скорости,
план запроса... ну и все такое.

Или уточните что вам по барабану скорость и вы тут просто
изучаете возможности СКЛ-а в отрыве от конкретной задачи.
Что тоже интересно само по себе :-)
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38485418
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Скорее последнее, так как до больших объемов еще очень далеко, база только начинает заполняться. НО по опыту другого аналогичного проекта с уже приличной базой, даже при самых оптимальных запросах(наверное) которые делал опытный эскуэльщик, потребовался дорогой выделенный сервер. Мне бы хотелось чтобы база как можно дольше работала и росла на дешевом виртуальном сервере и не тормозила.
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38485430
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D_PavelСкорее последнее, так как до больших объемов еще очень далеко, база только начинает заполняться. НО по опыту другого аналогичного проекта с уже приличной базой, даже при самых оптимальных запросах(наверное) которые делал опытный эскуэльщик, потребовался дорогой выделенный сервер. Мне бы хотелось чтобы база как можно дольше работала и росла на дешевом виртуальном сервере и не тормозила.

ок, понятно, тогда я бы поставил приоритетом пиво.

Не имея в наличии реальной проблемы, не имея в наличии
больших данных -- вы даже план реальный не получите.

Кроме того, пока вы доживете до больших
обьемов -- структура данных и все апликация
поменяется на 90%...
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38485433
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javajdbcКроме того, пока вы доживете до больших
обьемов -- структура данных и все апликация
поменяется на 90%...вот это куда весомее, чем какие-то там планы :)
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38486858
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделал все вроде оптимально, только в этом месте вопрос:

Код: sql
1.
2.
3.
4.
5.
SELECT *,
	( select datetime
	from messages where messages.parent = topics.key)
FROM topics
LIMIT 10



Мне кажется что тут не правильно. Наверное выбираться будут все записи из таблицы topics, параллельно будут выбираться записи с условием из таблицы messages, и только потом будет отсечение всех кроме первых 10 штук.

А правильнее сначала выбрать записи из таблицы topics, отсечь все кроме первых 10, и потом по этим 10 выбирать с условием из таблицы messages.

Или это не важно, и оптимизатор все сам сделает как надо?
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38486859
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Исправил (наверное) вот так, правильно??:

Код: sql
1.
2.
3.
SELECT *,
	( select max(datetime) from messages where messages.parent = topics.key)
FROM (select * from topics LIMIT 10) as topics



В первом запросе ошибка, должно быть конечно вот так:

Код: sql
1.
2.
3.
4.
SELECT *,
	( select max(datetime) from messages where messages.parent = topics.key)
FROM topics
LIMIT 10
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38486879
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И еще вопрос в довесок к предыдущему: Сделал три запроса дающих нужный результат, какой быстрее?
Запросы конечно сильно упростил, убрал ограничивающие условия.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
#1
select (select datetime from topics where topics.key = p.parent) datetime
from ( SELECT parent FROM messages GROUP BY parent ) p
#2
SELECT datetime
FROM topics
where topics.key in	( SELECT parent FROM messages ) # GROUP BY parent???
#3
SELECT topics.datetime
FROM topics
JOIN messages ON topics.key = messages.parent
GROUP BY datetime
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38486883
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D_Pavelкакой быстрее?выполните и посмотрите, вы всё-таки ближе к своему серверу, чем мы :)
D_PavelЗапросы конечно сильно упростил, убрал ограничивающие условия.здравствуйте, у меня есть запорожец и москвич, какой из них быстрее? кстати, на самом деле я заправляюсь бензином, но вы при ответе на вопрос считайте, что они работают на ДТ :)
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38486892
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Теоретически москвич быстрее потому что у него соотношение (мощность, крутящий момент)/масса больше.
Можно ли так же ответить на мой вопрос?
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38487021
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
SELECT datetime
FROM topics t
where exists(select 1 from messages m where m.parent=t.key)
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38487026
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой, это ж MySQL... Хз, я про ответил MS SQL
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38487155
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D_PavelТеоретически москвич быстрееТеоретически если их заправить дизтопливом, то ни один, ни другой даже с места не сдвинутся. Пойдёт такой ответ? :)
А практически вам может ответить только оптимизатор на ваших данных.
Разве что второй вариант можно с вероятностью в 99.9% исключить, если у вас мускл версии 5.5 и ниже.
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38488281
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не верно, у меня все запросы с места сдвигаются в любом варианте, так что такой ответ не годится.

Почему второй вариант можно исключить?
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38488287
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D_Pavel, потому что in-subquery в версиях до 5.5 включительно оптимизатор практически всегда рассматривает как зависимый подзапрос, даже если он , как в вашем случае, независимый.
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38488303
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Почему у меня так: индекс не используется в таблице topics
[img=http://pavel.cc/photo/screenshot(5).jpg] ссылка1

хотя вот ак используется:
[img=http://pavel.cc/photo/screenshot(6).jpg] ссылка2

PS: Чото картинки не вставляются
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38488311
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D_PavelПочемуПотому что 15236671
Абсолютно та же ситуация. Переписывайте через джойн, всё заработает как надо.
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38489435
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Там написано что только для версии до 5.5.
через join то же самое, я это сразу проверил.
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38489732
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D_PavelТам написано что только для версии до 5.5.Ну вы ведь версию своего мускля вообще не озвучили. И не "до 5.5", а "до 5.5 включительно".
D_Pavelчерез join то же самоеЧто "то же самое"? Такой же план? С dependent subquery? Не верю! (с) Показывайте свой джойн.
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38489735
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Eще не понятно, что показывает функция EXPLAIN: скриншот
Выбираются на самом деле все 15 записи с 4 различными значениями parent из таблицы messages, но эта функция в колонке rows показывает число 1. Почему там 1?
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38489737
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
***! Что вы хотите оптимизировать на 15 записях?!! Какие нахрен планы на 15 записях?? Наполните таблицу данными, близкими к реальным, а лучше реальными, и только потом можно будет о чём-то говорить.
И это, кстати, вообще другой запрос, с выбором других полей и без группировки.
facepa~1.bmp
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38489744
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
То есть если я сказал что у меня 15 записей, то вы не знаете ответ на мой вопрос? Какие группировки нужны? Как изменить запрос чтобы использовались индексы?
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38489748
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D_PavelТо есть если я сказал что у меня 15 записей, то вы не знаете ответ на мой вопрос?А вопрос-то какой? "Какой запрос быстрее"? Тогда ответ будет таким: на 15 записях никакой разницы.
D_PavelКакие группировки нужны? а вот этот вопрос вообще ко мне??! это ваш запрос, вам лучше знать, что вы хотите получить в результате - а добавление группировки изменит этот самый результат.
D_PavelКак изменить запрос чтобы использовались индексы?Если у вас 15 записей, то никакие индексы не нужны вообще. Серверу проще прочитать обе таблицы целиком.
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38489757
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot tanglir]А вопрос-то какой? "Какой запрос быстрее"? Тогда ответ будет таким: на 15 записях никакой разницы.[quot tanglir] нет. Вопрос был "Почему так http://pavel.cc/photo/screenshot(16).jpg используются индексs, а вот так http://pavel.cc/photo/screenshot(15).jpg не используются, и как сделать чтобы тоже использовались?"

tanglir а вот этот вопрос вообще ко мне??! это ваш запрос, вам лучше знать, что вы хотите получить в результате - а добавление группировки изменит этот самый результат.Вы же сами написали что у меня в новом запросе нет группировок. Я спрашиваю, о каких группировках идет речь?

tanglirЕсли у вас 15 записей, то никакие индексы не нужны вообще. Серверу проще прочитать обе таблицы целиком.Зачем тогда он использует индексы в http://pavel.cc/photo/screenshot(16).jpg ? Наверное ему не важно сколько записей, он делает один и тот же план для любого количества. И если получится сделать хороший запрос для 4 записей, то он будет таким же для 150000 записей.
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38489889
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D_Pavelо каких группировках идет речь?О тех, что были в предыдущих запросах. Но если речь уже не о них, то проехали.

D_PavelЗачем тогда он использует индексы в http://pavel.cc/photo/screenshot(16).jpg ?Потому что в первом запросе есть фильтр по первичному ключу. Выбираются всего 2 записи (из 15?). Хотя учитывая, что там всего 15 записей, я, честно говоря, не понимаю, почему оптимизатор решил там использовать индекс, быстрее было бы вычитать всю таблицу целиком.
А во втором фильтра нет, есть только связь. Так вот оптимизатор посчитал, что выгодней целиком прочитать topics и к ней прицепить записи из messages, используя индекс по messages.parent. Только используется он, повторюсь, не для фильтрации, а для соединения. У вас запросы абсолютно разные вещи делают, а вы хотите сравнивать использование индексов...

D_Pavelне важно сколько записей, он делает один и тот же план для любого количества. И если получится сделать хороший запрос для 4 записей, то он будет таким же для 150000 записей.Совсем необязательно.
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38489957
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как тогда сделать вместо соединения фильтрацию? Например если из одной таблицы выбрались две записи, то сделать фильтрацию по этим двум записям во второй таблице по ключу, чтобы выбралось тоже две записи, а не читалась вся таблица?
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38490033
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D_PavelКак тогда сделать вместо соединения фильтрацию?пц
товарищи, я пас
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38490079
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть кто-нибудь другой кто знает как это сделать?
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38491385
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D_PavelНаверное ему не важно сколько записей, он делает один и тот же план для любого количества. И если получится сделать хороший запрос для 4 записей, то он будет таким же для 150000 записей. Почитайте Когда создавать индексы , Определяем порядок столбцов в составном индексе
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38491671
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо! Классная штука, этот составной индекс.

Еще вопрос появился.

Запрос:
Код: sql
1.
2.
3.
EXPLAIN SELECT distinct topics.*
FROM topics join messages
ON topics.key = messages.parent Where messages.nik = 'ss'



В зависимости от условия Where messages.nik = '*****' меняется план запроса. Если в ковычках поставить значение которое часто встречается в колонке таблицы, то в плане запроса видно что индекс по этой колонке не используется. Если значение встречается редко или вообще не встречается, то индекс используется.
Почему так? Разве оптимизатор знает какое значение сколько раз используется до того как выполнит запрос?
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38492206
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D_PavelРазве оптимизатор знает какое значение сколько раз используется до того как выполнит запрос?Да! Прочитайте уже оф.доку про индексы , что ли...
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38493584
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Зачем советовать читать текст на английском языке, если там не слова нет про то что я спросил!? Я потратил время впустую.
Модератор: Даже если ссылка с Вашей точки зрения не годна, это еще не повод переходить на личности.
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38493586
D_Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MySQL у меня версии 5.5.3
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38493714
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D_PavelЗачем советовать читать текст на английском языкеНа русском языке не существует приличной доки по современным версиям MySQL. На остальные языки тоже происходит перевод, качество которого неизвестно. Так что английский вариант - самый правильный.
D_Pavelесли там не слова нет про то что я спросил!? Я потратил время впустую.Ну не так чтобы совсем ни слова...How MySQL Uses IndexesSometimes MySQL does not use an index, even if one is available. One circumstance under which this occurs is when the optimizer estimates that using the index would require MySQL to access a very large percentage of the rows in the table. (In this case, a table scan is likely to be much faster because it requires fewer seeks.)
Еще вот такая ссылка пригодится:
http://dev.mysql.com/doc/refman/5.5/en/analyze-table.html ANALYZE TABLE analyzes and stores the key distribution for a table.
...
MySQL uses the stored key distribution to decide the order in which tables should be joined when you perform a join on something other than a constant. In addition, key distributions can be used when deciding which indexes to use for a specific table within a query.
...
Рейтинг: 0 / 0
Помогите исправить простой запрос
    #38493753
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D_PavelРазве оптимизатор знает какое значение сколько раз используется до того как выполнит запрос?SQL накапливает статистику по всем таблицам и индексам. Так что да, он может предположить, сколько строк будет получено в результате того или иного запроса, и выбрать на основе этого предположения наименее затратный способ извлечь эти данные. Как правило, оценка достаточно точная для построения оптимального плана выполнения, но бывает, что статистика неверна и фактическое число строк отличается от предполагаемого на порядки - в этом случае построенный план оптимальным не будет.

По MySQL не нашел хорошей ссылки, но вот есть про Использование статистики оптимизатором запросов Microsoft SQL Server 2005 Конечно, в MySQL (с версионностью) что-то делается не так, но общие принципы, ятд, остаются в силе
...
Рейтинг: 0 / 0
56 сообщений из 56, показаны все 3 страниц
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите исправить простой запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]