SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 14.03.2010 00:17:36

leaf2010
Участник
Зарегистрирован: 14.03.2010
Сообщений: 4

Подсчет количества записей каждой группы

Добрый день. У меня 2 вопроса:

1. Имеется 1млн. записей. Допустим поле float содержит неуникальные числа в определенном диапозоне. Все числа условно можно разделить на N групп (поддиапозонов). Необходимо сформировать запрос, который бы позволял быстро получить N строк содержащих кол-во записей в каждой группе.
Например,

Имеется таблица из 2-х полей

id  | num
--------
1  | 2
2  | 4
3  | 7
4  | 2
5  | 2
6  | 11
7  | 2
8  | 12

Я хочу узнать сколько в таблице чисел меньше 10 и сколько больше 10
В качестве результат хочу получить, что-нибудь вроде

cond | count
------------
>10  | 2
<10  | 6

И чтобы это работало быстро для таблицы с миллионом записей.



2. Часто приходится слышать о каком-то анализаторе sql-запросов. То ли phpmyadmin позволяет подробно посмотреть что делает БД выполняя тот или иной запрос. В общем как обычно люди оценивают производительность запросов. Что-то вроде профайлинга sql-запросов может есть. Не подскажите?

UPD: Второй вопрос можно сказать отпадает. Речь шла об EXPLAIN-запросе.

Спасибо.

Отредактированно leaf2010 (14.03.2010 00:21:57)

Неактивен

 

#2 14.03.2010 00:29:39

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Подсчет количества записей каждой группы

1.
SELECT '>=10' AS cond, COUNT(*) AS `count` FROM tablename WHERE num >= 10
UNION
SELECT '<10', COUNT(*) FROM tablename WHERE num < 10;

2. В 5.1 есть еще и полноценный профайлер запросов: http://dev.mysql.com/tech-resources/art … filer.html

Неактивен

 

#3 14.03.2010 11:47:07

leaf2010
Участник
Зарегистрирован: 14.03.2010
Сообщений: 4

Re: Подсчет количества записей каждой группы

paulus, спасибо.

А является ли второй SELECT подзапросом. Т.е. будет ли он кэширован? Подзапросы ведь не кэшируются. А у меня таких UNION'ов будет до 20 на один запрос. Хотелось бы их кэшировать.
Плюс у меня будет ещё поле AVG(num).

Неактивен

 

#4 14.03.2010 13:29:18

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Подсчет количества записей каждой группы

Второй select подзапросом не является. Кэширован будет результат выполнения всего запроса целиком, а не отдельных его частей. AVG(num) не повлияет.

Подробнее см статью Кеширование запросов в MySQL

Неактивен

 

#5 14.03.2010 13:40:37

leaf2010
Участник
Зарегистрирован: 14.03.2010
Сообщений: 4

Re: Подсчет количества записей каждой группы

vasya, я имею ввиду второй select после union, в запросе который предложил paulus

paulus написал:

1.
SELECT '>=10' AS cond, COUNT(*) AS `count` FROM tablename WHERE num >= 10
UNION
SELECT '<10', COUNT(*) FROM tablename WHERE num < 10;

1. Делаю reset кэша
2. Qcache_queries_in_cache = 0
3. Я делаю 20 UNION'ов. Выполняю запрос.
4. Qcache_queries_in_cache = 5
5. Меняю условия в 3-х UNION'ах. Выполняю запрос.
6. Qcache_queries_in_cache = 6

Выходит сначала он помимо моего запроса скэшировал ещё какие-то 4. А далее любой составной запрос на UNION'ах кэширует как один.

Вопрос: существенная ли разница между 20 отдельными запросами SELECT (вообще это разумно?) или одним построеным на UNION'ах?

Неактивен

 

#6 14.03.2010 14:06:08

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Подсчет количества записей каждой группы

Я тоже говорю о втором селекте после unioun. Это называется второй запрос в объединении. Кэширован он не будет. Будет кэширован весь запрос целиком.


Составной запрос на UNION'ах сразу кэширует как один. А вот откуда беруться ещё 4 запроса, это уже вопрос к вам. Я, правда, проверял на приведенном примере их двух объединений.

Неактивен

 

#7 14.03.2010 14:15:08

leaf2010
Участник
Зарегистрирован: 14.03.2010
Сообщений: 4

Re: Подсчет количества записей каждой группы

vasya написал:

А вот откуда беруться ещё 4 запроса, это уже вопрос к вам.

ну, это судя по всему какие-то доп.запросы phpmyadmin.
а как насчет

leaf2010 написал:

существенная ли разница между 20 отдельными запросами SELECT (вообще это разумно?) или одним построеным на UNION'ах?

Неактивен

 

#8 14.03.2010 17:07:36

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Подсчет количества записей каждой группы

leaf2010 написал:

существенная ли разница между 20 отдельными запросами SELECT (вообще это разумно?) или одним построеным на UNION'ах?

Не очень понял ваш вопрос. По сути, UNION просто объединяет результат выполнения отдельных запросов SELECT.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson