За последние 24 часа нас посетили 17990 программистов и 1650 роботов. Сейчас ищут 1199 программистов ...

Помогите с оптимизировать.

Тема в разделе "MySQL", создана пользователем RomanBush, 6 мар 2008.

  1. RomanBush

    RomanBush Активный пользователь

    С нами с:
    5 дек 2007
    Сообщения:
    798
    Симпатии:
    0
    Адрес:
    200 км от Москвы
    Что-то не соображу.
    PHP:
    1. <?
    2. $get1=mysql_fetch_array(mysql_query("SELECT count(*) as nbr FROM test WHERE val<=2"));
    3. $get2=mysql_fetch_array(mysql_query("SELECT count(*) as nbr FROM test WHERE val>=4"));
    4. $res=$get2['nbr']-$get1['nbr'];
    5. ?>
    Можно как-то это одним запросом сделать? И будет ли этот запрос быстрее, чем вот это?
    Значение val - от 0 до 5 включительно.
     
  2. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    [sql]select COUNT(case when val>=4 then 1 else null end) as get1, COUNT(case when val<=2 then 1 else null end) as get2
    from test[/sql]
    но скорее всего два запроса будут быстрее.
     
  3. RomanBush

    RomanBush Активный пользователь

    С нами с:
    5 дек 2007
    Сообщения:
    798
    Симпатии:
    0
    Адрес:
    200 км от Москвы
    Спасибо. Классный запрос.
    Время выполнения 0,02 сек. Результат - get1=3276, get2=0 (там действительно ноль).
    Итого - я сильно сомневаюсь, что два запроса будут быстрее, чем 0,02 сек.
    В таблице примерно 10к записей. В запросе, естесно, были ещё WHERE ...
     
  4. RomanBush

    RomanBush Активный пользователь

    С нами с:
    5 дек 2007
    Сообщения:
    798
    Симпатии:
    0
    Адрес:
    200 км от Москвы
    Кстати, работает вот так:
    [sql]select (COUNT(case when val>=4 then 1 else null end)) - (COUNT(case when val<=2 then 1 else null end)) as get1 from test[/sql]
    с той же скоростью. От 0,02 до 0,08 сек.
     
  5. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    RomanBush
    Если на поле val навесить индекс, то 2 запроса будут крайне экономными (скорее всего, мускул даже в таблицу не полезет, одного индекса будет достаточно для определения количества записей).
    Комбинированный же запрос будет всегда перепахивать таблицу целиком, т.к. нет блока WHERE.