SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 01.07.2010 16:08:15

rame0
Участник
Зарегистрирован: 01.07.2010
Сообщений: 11

Помогите ускорить запрос

Здравствуйте, господа!
Есть у меня один запрос, выполняется очень долго, порой до 30 секунд, при том, что размер таблицы всего ~500 записей...
Я себе уже всю голову сломал... В MySQL я не профессионал, поэтому даже не знаю что мне сделать sad


select * from `offices`
where 0=0
and `buy`= 1               /// Без этих строк
and `сircles` in ( 2, 3)   ///  работает медленнее
and `id` in
(
    select `parent` from `oSizes`
    where
    (
        IF
            (
                `size` >0 ,
                NOT ( `size` >= 500 OR `sizeto`<= 75),
                `sizeto`BETWEEN 75 AND 500
            )
    ) GROUP BY `parent`
)
and `id` in
(
    SELECT `oPrices`.`parent` FROM `oPrices`
    LEFT JOIN `dtz_currency`
    ON `dtz_oPrices`.`currnecy` = `dtz_currency`.`id`
    WHERE
    (
        IF
            (
                `oPrices`.`price` >0 ,
                NOT (`oPrices`.`price` >= 5000 OR `oPrices`.`priceto`<= 100),
                `oPrices`.`priceto` BETWEEN 100 AND 5000
            )
    ) GROUP BY `oPrices`.`parent`
)
 

Неактивен

 

#2 01.07.2010 16:14:40

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

Re: Помогите ускорить запрос

Запрос ужасен. Напишите структуру таблиц, и что хочется получить? smile

Неактивен

 

#3 01.07.2010 17:51:35

rame0
Участник
Зарегистрирован: 01.07.2010
Сообщений: 11

Re: Помогите ускорить запрос

Это головная таблица со списокм объектов:


select id, parent, name, buy, rent, enabled, circles  from `offices`  limit 10;
+----+--------+---------+-----+------+---------+---------+
| id | parent | name    | buy | rent | enabled | circles |
+----+--------+---------+-----+------+---------+---------+
| 10 |      2 | Оффис 1 |   1 |    0 |       0 |       0 |
| 12 |      2 | Оффис 2 |   1 |    0 |       0 |       3 |
| 32 |      1 | Оффис 3 |   0 |    1 |       0 |       3 |
| 38 |      1 | Оффис 4 |   0 |    1 |       0 |       2 |
| 39 |      2 | Оффис 5 |   1 |    0 |       0 |       2 |
| 56 |      1 | Оффис 6 |   0 |    1 |       0 |       3 |
| 67 |      1 | Оффис 7 |   0 |    1 |       0 |       1 |
| 78 |      1 | Оффис 8 |   0 |    1 |       0 |       2 |
| 85 |      1 | Оффис 9 |   0 |    1 |       0 |       1 |
+----+--------+---------+-----+------+---------+---------+
9 rows in set (0.03 sec)
 


Таблица площадей. Вынесена в отдельную таблицу, т.к. у одного объекта может быть несколько площадей

select * from `oSizes`;
+-----+--------+----------------------------------------------------------------------------------+------+--------+
| id  | parent | name                                                                             | size | sizeto |
+-----+--------+----------------------------------------------------------------------------------+------+--------+
|  26 |     10 | Строение 1:  блоки от 45 кв.м. до 303 кв.м.                                      |   45 |    303 |
|  27 |     10 | Общая свободная площадь стр.1 - 1950 кв.м                                        |    0 |   1950 |
|  29 |     10 | Строение 10: блоки от 43 кв.м. до 129 кв.м                                       |   43 |    129 |
|  30 |     10 | Общая свободная площадь стр.10 - 322 кв.м                                        |    0 |    322 |
|  33 |     12 | Блоки от 60 до 1564 кв.м                                                         |   60 |   1564 |
|  34 |     12 | Площадь этажа около 1000 кв.м.                                                   |    0 |   1000 |
|  71 |     32 | 1 этаж – 630 кв.м с отдельным входом                                             |    0 |    630 |
|  72 |     32 | 2 этаж –  15,7 кв.м., 60 кв.м.,  64 кв.м., 100 кв.м.                             |   15 |    100 |
|  80 |     38 | Особняк Морозов : 1 100 кв.м;                                                    |    0 |   1100 |
|  81 |     38 | Особняк Рябушинский: 524 кв.м;                                                   |    0 |    524 |
|  83 |     38 | Строганов: 137 кв.м, 198 кв.м;                                                   |  137 |    198 |
|  88 |     38 | Мамонтов: 103,6 кв.м, 210,5 кв.м, 657,4 кв.м + 693 кв.м (с августа), 231,6 кв.м. |  103 |    231 |
|  89 |     39 | 13000 кв.м                                                                       |    0 |  13000 |
| 134 |     56 | Возможно деление на блоки. 4 этаж: 2400 кв.м;                                    |    0 |   2400 |
| 135 |     56 | Цоколный этаж: 900 кв.м;                                                         |    0 |    900 |
| 136 |     56 | 700 кв.м;                                                                        |    0 |    700 |
| 169 |     67 | Блоки от 50 до 1040 кв.м;                                                        |   50 |   1040 |
| 170 |     67 | Свободно: 5000 кв.м.                                                             |    0 |   5000 |
| 198 |     78 | 1 этаж : 76.5 кв.м, 849.4 кв.м, 486.5 кв.м.;                                     |   76 |    849 |
| 199 |     78 | 2 этаж – 806 кв.м, 390.7 кв.м, 434.3 кв.м, 660 кв.м, 751.3 кв.м;                 |  390 |    806 |
| 200 |     78 | 3 этаж – 545.7 кв.м, 262.3 кв.м;                                                 |  262 |    545 |
| 201 |     78 | 4 этаж – 745.6 кв.м, 432 кв.м, 547.7 кв.м;                                       |  432 |    745 |
| 202 |     78 | 5 этаж – 1720 кв.м, 432 кв.м, 574.7 кв.м, 443.5 кв.м, 257 кв.м,1600 кв.м.        |  257 |   1720 |
| 214 |     85 | Здание 1: 7ой этаж -  799 кв.м, 344 кв.м;                                        |  344 |    799 |
| 215 |     85 | Здание 2:  2ой этаж: 746 кв.м;                                                   |    0 |    746 |
| 216 |     85 | 3ий этаж - 934 кв.м;                                                             |    0 |    934 |
| 217 |     85 | 7ой этаж - 649 кв.м;                                                             |    0 |    649 |
| 218 |     85 | 13ый этаж - 479 кв.м;                                                            |    0 |    479 |
| 219 |     85 | 17ый этаж -  487 кв.м;                                                           |    0 |    487 |
| 220 |     85 | 21ый этаж - 1287 кв.м;                                                           |    0 |   1287 |
| 221 |     85 | 22ой этаж - 536 кв.м;                                                            |    0 |    536 |
| 222 |     85 | 23ий этаж: 776 кв.м;                                                             |    0 |    776 |
| 223 |     85 | 24ый этаж - 350 кв.м;                                                            |    0 |    350 |
| 224 |     85 | Здание 3:  3ий, 4ый этажи: 2325 кв.м;                                            |    0 |   2325 |
| 225 |     85 | 5ый этаж: 745 кв.м;                                                              |    0 |    745 |
| 226 |     85 | 8ой этаж: 1194 кв.м.                                                             |    0 |   1194 |
+-----+--------+----------------------------------------------------------------------------------+------+--------+
36 rows in set (0.00 sec)
 



Это таблица со списком цен для объектов (вынесено в таблицу, т.к. у обекта может быть несколько вариантов цен)

mysql> SELECT * FROM `oPrices` limit 10
+-----+--------+------------------------------------------+------------------+------+------------+-------+----------+---------+
| id  | parent | name                                     | sinonim          | sort | modified   | price | currnecy | priceto |
+-----+--------+------------------------------------------+------------------+------+------------+-------+----------+---------+
|  12 |     10 | от $4 150 до $5 050                      | 4150-5050        |    2 | 1274899989 |  4150 |        3 |    5050 |
|  14 |     10 | от $4 100 до $5 000                      | 4_100_do_5_000   |    4 | 1274900022 |  4100 |        3 |    5000 |
|  17 |     12 | 70 000 рублей - 160 000 рублей           | 160_000          |    2 | 1274900836 | 70000 |        1 |  160000 |
|  40 |     32 | 7800-8500                                | 8500             |    2 | 1274955558 |  7800 |        1 |    8500 |
|  45 |     38 | от $500                                  | 500              |    1 | 1274956371 |   500 |        3 |       0 |
|  47 |     39 | $8 500  - $9 500                         | 9_500            |    2 | 1274901775 |  8500 |        3 |    9500 |
|  96 |     56 | $300-$450                                | 300-450          |    1 | 1274963114 |   300 |        3 |     450 |
| 111 |     67 | от 5500 до 15000                         | 5500_do_15000    |    1 | 1275003588 |  5500 |        1 |   15000 |
| 124 |     78 | От 12000 до 16000 рублей за кв.м в год;  | 12000_do_16000   |    1 | 1275047358 | 12000 |        1 |   16000 |
| 132 |     85 | 620 - 875 евро                           | 620-875          |    1 | 1275054531 |   620 |        2 |     875 |
+-----+--------+------------------------------------------+------------------+------+------------+-------+----------+---------+
10 rows in set (0.00 sec)
 


Таблица с валютами. Здесь указывается курс пересчета.

select * from currency
+----+--------+------+------+------------+--------+
| id | parent | name | sort | modified   | rate   |
+----+--------+------+------+------------+--------+
|  1 |      0 | руб. |   10 | 1277979523 |  0.032 |
|  2 |      0 | eur  |   20 | 1277979573 |  1.222 |
|  3 |      0 | usd  |   30 | 1277976868 |      1 |
+----+--------+------+------+------------+--------+
 



Суть запроса такая: в поиске указывается цена от и до в долларах. Я делал запрос таким образом, чтобы он искал цену не только в полях, валюта которых доллары, но и там, где валюта другая. При этом учитывается, задан ли в свойствах интервал площади или валюты ("от/до") или стоит конкретное значение (в таком случае в поле "от" ставится 0 )

Сам запрос (в первом посте он старый):

select * from `offices`
where 0=0
and `buy`= 1               # Без этих строк
and `сircles` in ( 2, 3)   # работает медленнее
and `id` in
(
# Тут идет выборка по размеру
    select `parent` from `oSizes`
    where
    (
        IF
            (
                `size` >0 , # если в поле `size` цена > 0,
                NOT ( `size` >= 500 OR `sizeto`<= 75), # имеем интервал площадей
                `sizeto`BETWEEN 75 AND 500 # иначе у нас фиксированная площадь, указанная в `sizeto`
            )
    ) GROUP BY `parent` # убираю повторения
)

# тут идет условие по цене
and `id` in
(
    SELECT `oPrices`.`parent` FROM `oPrices`
    # учитываем валюту цены
    LEFT JOIN `dtz_currency`
    ON `dtz_oPrices`.`currnecy` = `dtz_currency`.`id`
    WHERE
    (
        IF
            (
                `oPrices`.`price` >0 , # если в поле `size` цена > 0,
                NOT ( # имеем интервал цен
                        `oPrices`.`price`*`dtz_currency`.rate >= 5000
                        OR `oPrices`.`priceto`*`dtz_currency`.rate<= 100
                     ),
                `oPrices`.`priceto` BETWEEN 100 AND 5000 # иначе у нас стоит фиксированная цена в поле `priceto`
            )
    ) GROUP BY `oPrices`.`parent` # убираю повторения
)
 

Неактивен

 

#4 01.07.2010 18:42:38

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

Re: Помогите ускорить запрос

У Вас есть офисы (в русском языке одна буква ф), помещения в офисах и —
дальше не понятно — цены на объект? На офисы? На помещения? Независимые?

Не понятно, что такое size и sizeto sad

Т.е. если нужно найти объекты с ценой между тем-то и тем-то, то это запрос
по одной табличке. Если объекты == офисы, то ограничение по площади —
это тоже запрос по одной табличке. Одновременно два условия — это объ-
единение двух табличек. Но не такой страшный зверь.

Неактивен

 

#5 01.07.2010 19:12:22

rame0
Участник
Зарегистрирован: 01.07.2010
Сообщений: 11

Re: Помогите ускорить запрос

paulus написал:

У Вас есть офисы (в русском языке одна буква ф), помещения в офисах и —
дальше не понятно — цены на объект? На офисы? На помещения? Независимые?

Не понятно, что такое size и sizeto sad

Т.е. если нужно найти объекты с ценой между тем-то и тем-то, то это запрос
по одной табличке. Если объекты == офисы, то ограничение по площади —
это тоже запрос по одной табличке. Одновременно два условия — это объ-
единение двух табличек. Но не такой страшный зверь.

Нет, есть только офисы. Хотя и помещения в них бывают разные, но данных по ним нет, поэтому размеры и цены помещений привязываются непосредственно к таблице офисов. "size и sizeto" (как и "price и priceto") - это интервал площади size - "площадь от", sizeto - площадь до. Если "площадь от" не указана, т.е. в size стоит значение <= 0, то значит площадь фиксированная и указана в "площади до" (sizeto)

По поводу объединения табличек не вкурил... Как я понял, вы предлагаете сделать JOIN'ы? Я просто не уверенно себя в них чувствую, поэтому мало использую...

Неактивен

 

#6 05.07.2010 13:35:00

rame0
Участник
Зарегистрирован: 01.07.2010
Сообщений: 11

Re: Помогите ускорить запрос

paulus написал:

У Вас есть офисы (в русском языке одна буква ф), помещения в офисах и —
дальше не понятно — цены на объект? На офисы? На помещения? Независимые?

Не понятно, что такое size и sizeto sad

Т.е. если нужно найти объекты с ценой между тем-то и тем-то, то это запрос
по одной табличке. Если объекты == офисы, то ограничение по площади —
это тоже запрос по одной табличке. Одновременно два условия — это объ-
единение двух табличек. Но не такой страшный зверь.

Да, вот еще на всякий случай сделал схему БД, чтобы было понятнее:
http://www.rame0.ru/wp-content/uploads/DBSchema.png

И изобразил на картинке пример выбора цены.
Легенда:
красная рамка - введенный пользователем запрос цены "от-до"
зеленый прямоугольник - "отрезок цены" (имеется в виду "цена от" (price) и "цена до" (priceto)) подходящий под запрос
белая рамка - "отрезок цены" не подходящий под запрос

http://www.rame0.ru/wp-content/uploads/price.jpg

Неактивен

 

#7 05.07.2010 13:53:43

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

Re: Помогите ускорить запрос

Хм. Не понимаю. У меня есть офис 151 кв.м. У него площадь от 151 кв.м. до 151 кв.м.
Зачем хранить два поля для одного значения?

Да, тренируйтесь в JOIN, сэкономите себе кучу сил smile

Неактивен

 

#8 05.07.2010 14:07:29

rame0
Участник
Зарегистрирован: 01.07.2010
Сообщений: 11

Re: Помогите ускорить запрос

paulus написал:

Хм. Не понимаю. У меня есть офис 151 кв.м. У него площадь от 151 кв.м. до 151 кв.м.
Зачем хранить два поля для одного значения?

Да, тренируйтесь в JOIN, сэкономите себе кучу сил smile

А я раньше и не хранил. Просто бывают такие вещи, что в описании здания может быть указано:
1 этаж: офисы от 100 кв.м. до 300 кв.м.;
2 этаж: офисы от 10 кв.м. до 1300 кв.м.
....
n этаж: офисы от k кв.м. до k+-d кв.м.

Как то вот так...
С ценами такая же байда.

Неактивен

 

#9 05.07.2010 14:16:48

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

Re: Помогите ускорить запрос

Мде, неудачные у Вас данные smile

Но в любом случае, ограничение по цене пишется как-то так:
min_requested_price <= priceto AND max_requested_price >= price

Аналогично пишется ограничение по площади. Без вот этих страшенных
подзапросов.

Неактивен

 

#10 05.07.2010 14:32:17

rame0
Участник
Зарегистрирован: 01.07.2010
Сообщений: 11

Re: Помогите ускорить запрос

paulus написал:

Мде, неудачные у Вас данные smile

Но в любом случае, ограничение по цене пишется как-то так:
min_requested_price <= priceto AND max_requested_price >= price

Аналогично пишется ограничение по площади. Без вот этих страшенных
подзапросов.

Было бы, конечно, гораздо проще, если бы я поставил цену и площадь непосредственно в объект. Но этого сделать не получится, т.к. их может быть несколько. Поэтому пришлось вынести их в отдельные таблицы sad

Или вы про IF'ы? Они что сильно замедляют запрос? Там же всего лишь проверка, если так, то такое условие, если нет, то другое...

Неактивен

 

#11 05.07.2010 14:35:49

rame0
Участник
Зарегистрирован: 01.07.2010
Сообщений: 11

Re: Помогите ускорить запрос

Да, с ценой там вообще гимор... в свойствах она может быть как в рублях, так в евро и долларах. А в поиске только в долларах, поэтому пришлось добавить дополнительный подзапрос и условие типа `oPrices`.`priceto`*`dtz_currency`
....

Неактивен

 

#12 05.07.2010 16:02:10

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

Re: Помогите ускорить запрос

Ну, цена в доллары преобразуется JOINом очень просто.

Неактивен

 

#13 05.07.2010 22:54:35

rame0
Участник
Зарегистрирован: 01.07.2010
Сообщений: 11

Re: Помогите ускорить запрос

paulus написал:

Ну, цена в доллары преобразуется JOINом очень просто.

Вот сделал 3 варианта запроса: только JOIN'ы, исходный, смешанный(JOIN'ы и подзапрос для валют)

Вот первый запрос: "только JOIN'ы"


select  tObj.id,tObj.`name`,
        tPrice.price,tPrice.priceto,
        tSize.`size`, tSize.`sizeto`
from `officesObjects` as tObj
    left join `oSizes` as tSize
        on tObj.id=tSize.parent
    left join oPrices as tPrice
        on tObj.id=tPrice.parent
    left join currency as tCurr
        on tPrice.`currnecy` = tCurr.`id`

where 0=0
and `buy`= 1               # Без этих строк
and `circles` in ( 2, 3)   # работает медленнее
and IF
    (
        tSize.`size` >0 , # если в поле `size` цена > 0,
        NOT ( tSize.`size` >= 500 OR tSize.`sizeto`<= 75), # имеем интервал площадей
        tSize.`sizeto`BETWEEN 75 AND 500 # иначе у нас фиксированная площадь, указанная в `sizeto`
    )


and IF
    (
        tPrice.`price` >0 , # если в поле `size` цена > 0,
        NOT ( # имеем интервал цен
                tPrice.`price` * tCurr.rate >= 5000
                OR tPrice.`priceTo` * tCurr.rate <= 100
             ),
        tPrice.`priceTo` * tCurr.rate BETWEEN 100 AND 5000 # иначе у нас стоит фиксированная цена в поле `priceto`
    )

group by tObj.id

 




Запрос второй: исходный

select * from `officesObjects`
where 0=0
and `buy`= 1               # Без этих строк
and `circles` in ( 2, 3)   # работает медленнее
and `id` in
(
# Тут идет выборка по размеру
    select `parent` from `oSizes`
    where IF
        (
            `size` >0 , # если в поле `size` цена > 0,
            NOT ( `size` >= 500 OR `sizeto`<= 75), # имеем интервал площадей
            `sizeto`BETWEEN 75 AND 500 # иначе у нас фиксированная площадь, указанная в `sizeto`
        )
    GROUP BY `parent` # убираю повторения
)

# тут идет условие по цене
and `id` in
(
    SELECT `oPrices`.`parent`
         FROM `oPrices`
    # учитываем валюту цены
    LEFT JOIN `currency`
    ON `oPrices`.`currnecy` = `currency`.`id`
    WHERE IF
        (
            `oPrices`.`price` >0 , # если в поле `size` цена > 0,
            NOT ( # имеем интервал цен
                    `oPrices`.`price`*`currency`.rate >= 5000
                    OR `oPrices`.`priceto`*`currency`.rate <= 100
                 ),
            `oPrices`.`priceto`*`currency`.rate BETWEEN 100 AND 5000 # иначе у нас стоит фиксированная цена в поле `priceto`
        )
    GROUP BY `oPrices`.`parent` # убираю повторения
)
 



Зарос 3-й: "смешанный"

select tObj.id,tObj.`name`,
tSize.`size`, tSize.`sizeto`
from `officesObjects` as tObj
    left join `oSizes` as tSize
        on tObj.id=tSize.parent
where 0=0
and `buy`= 1               # Без этих строк
and `circles` in ( 2, 3)   # работает медленнее
and IF
    (
        tSize.`size` >0 , # если в поле `size` цена > 0,
        NOT ( tSize.`size` >= 500 OR tSize.`sizeto`<= 75), # имеем интервал площадей
        tSize.`sizeto`BETWEEN 75 AND 500 # иначе у нас фиксированная площадь, указанная в `sizeto`
    )

and tObj.`id` in
(
    SELECT `oPrices`.`parent`
         FROM `oPrices`
    # учитываем валюту цены
    LEFT JOIN `currency`
    ON `oPrices`.`currnecy` = `currency`.`id`
    WHERE IF
        (
            `oPrices`.`price` >0 , # если в поле `size` цена > 0,
            NOT ( # имеем интервал цен
                    `oPrices`.`price`*`currency`.rate >= 5000
                    OR `oPrices`.`priceto`*`currency`.rate <= 100
                 ),
            `oPrices`.`priceto`*`currency`.rate BETWEEN 100 AND 5000 # иначе у нас стоит фиксированная цена в поле `priceto`
        )
    GROUP BY `oPrices`.`parent` # убираю повторения
)

group by tObj.id

 




Результаты замеров скорости выполнения.
Картинка №1 - здесь показана статистика времени выполнения в секундах, для каждого из запросов:
http://www.rame0.ru/wp-content/uploads/mysql_speed1.png


Картинка №2 - здесь показана статистика времени выполнения в секундах, для каждого из запросов. Здесь в каждом из запросов были удалены дополнительные условия
and `buy`= 1               # Без этих строк
and `circles` in ( 2, 3)   # работает медленнее


Вот результат.
http://www.rame0.ru/wp-content/uploads/mysql_speed2.png


Проделал я всю эту работу для того, что бы узнать у вас, почему смешанный запрос работает гораздо быстрее... Стоит ли его использовать и можно ли как то оптимизировать? smile

Да, еще одна странность: когда я выполняю те же самые запросы через NetBeans, у меня получается совсем другая статистика:
Запрос с JOIN'ами выполняется в 3-5 раз дольше, а запрос с подзапросами выполняется раза в 2-3 дольше чем смешанный запрос.
Собственно из-за этого я и стал тестировать, а когда писал, не обратил внимания, что статистика совсем другая, нежели я проверял через NetBeans...

Но все равно, по статистике смешанный запрос лучше чем чисто JOIN'ы... Или я просто неправильно составил запрос? smile
Надеюсь на вашу помощь. Спасибо.

Отредактированно rame0 (05.07.2010 22:59:15)

Неактивен

 

#14 06.07.2010 01:31:00

rame0
Участник
Зарегистрирован: 01.07.2010
Сообщений: 11

Re: Помогите ускорить запрос

Написал новый скрипт, делающий выборку данных для статистики. Вот такие графики получились:
На картинках, на нижних графиках отображается число строк в результате запроса.

Замена для варианта 1:
http://www.rame0.ru/wp-content/uploads/new_mysql_speed1.png

Замена для варианта 2:
http://www.rame0.ru/wp-content/uploads/new_mysql_speed2.png



До сих пор не понимаю, почему с JOIN'ами так медленно работает... Может у меня кривые руки... sad

Неактивен

 

#15 06.07.2010 13:15:24

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

Re: Помогите ускорить запрос

Перепишите без IF? Ну правда, у Вас нету необходимости использовать
таких страшных зверей.

Неактивен

 

#16 06.07.2010 13:49:35

rame0
Участник
Зарегистрирован: 01.07.2010
Сообщений: 11

Re: Помогите ускорить запрос

paulus написал:

Перепишите без IF? Ну правда, у Вас нету необходимости использовать
таких страшных зверей.

Как это нет?
Ситуация: цена помещения фиксированная, например 300 уе. Тогда значение `price` равно 0, а значение `priceto`=300

Если сделать без IF, то если пользователь будет искать помещение ценой от 200 до 500 уе, он ни чего не найдет, т.к. значение `size` будет меньше 200.

Хотя в принципе, можно в доках, что если цена фиксированная, то надо ее писать в оба поля... но это ИМХО костыль sad


Да, а по поводу графиков: не знаете, почему запрос только с JOIN'ами работает так медленно? От моих кривых рук, или в JOIN'ах все таки есть какое то ограничение на число объединяемых таблиц? Небольшое пояснение: в таблице `objects` порядка 20 столбцов.

Неактивен

 

#17 06.07.2010 14:08:47

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

Re: Помогите ускорить запрос

Храните данные консистентным образом. Если цена помещения фиксированно 300 уе, то
она от 300 до 300.

Костыль — это Ваши IFы, нужно руководствоваться здравым смыслом всегда smile

JOINы работают быстро в случае, если индексы разумно расставлены.

Неактивен

 

#18 06.07.2010 14:10:34

rame0
Участник
Зарегистрирован: 01.07.2010
Сообщений: 11

Re: Помогите ускорить запрос

paulus написал:

Храните данные консистентным образом. Если цена помещения фиксированно 300 уе, то
она от 300 до 300.

Костыль — это Ваши IFы, нужно руководствоваться здравым смыслом всегда smile

JOINы работают быстро в случае, если индексы разумно расставлены.

Спасибо за консультацию! Вы мне очень помогли.

Неактивен

 

Board footer

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