За последние 24 часа нас посетили 18155 программистов и 1700 роботов. Сейчас ищут 1697 программистов ...

Какие базы данных вы используете?

Тема в разделе "PHP и базы данных", создана пользователем Ksenius, 9 окт 2008.

?

Какую СУБД используете чаще всего?

  1. MySQL

    0 голосов
    0,0%
  2. PostgreSQL

    0 голосов
    0,0%
  3. MSSQL

    0 голосов
    0,0%
  4. Oracle

    0 голосов
    0,0%
  5. другую

    0 голосов
    0,0%
  1. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    флоппик
    SELECT * FROM table ORDER BY indexed_column LIMIT N1,N2
    Типичный пример для использования лимита - здесь можно и с буферизацией, и без буферизации, и мускул отдаст результат очень быстро. Дело не в "подводных камнях", дело в том, что не помешала бы удобная фича, да ее нету.
     
  2. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    Я не читал топик, но я юзаю mysql.
     
  3. а при N1 = 10000000, сколько строк обработается?
     
  4. EvelRus

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

    С нами с:
    16 ноя 2006
    Сообщения:
    2.168
    Симпатии:
    0
    Адрес:
    Москва
  5. Nemo, нет, в том то и дело, что обработается N1 + N2. Это в результате N1 строк будут отброшены (после выборки) и вернутся N2
     
  6. EvelRus

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

    С нами с:
    16 ноя 2006
    Сообщения:
    2.168
    Симпатии:
    0
    Адрес:
    Москва
    Ты даешь команду выбрать N2 записей начиная с N1
     
  7. Господи, кому я что обьясняю...
     
  8. Откуда у тебя возмется «начиная с N1 ?» тебе их надо сначала отсортировать. Потому что ORDER BY. А что бы отсортировать, надо их сначала выбрать все. Только если это уникальный индекс, и если выборка только по одной таблице, и нет условий по другим полям, этого не произойдет.
     
  9. EvelRus

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

    С нами с:
    16 ноя 2006
    Сообщения:
    2.168
    Симпатии:
    0
    Адрес:
    Москва
    А, Вы об этом :))) Тогда я просто не понял задачи :)
     
  10. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    [sql]EXPLAIN SELECT…[/sql]само всё покажет
     
  11. Luge, думаешь, он умеет им пользоваться??
     
  12. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    надеюсь :(
     
  13. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    флоппик
    Немо прав. Если на поле навешен индекс - мускул сразу найдет N1-ю запись в дереве индекса и дальше начнет отбирать N2 записей, также при помощи индекса.

    При чем тут уникальный-неуникальный? Насчет других таблиц-других полей не спорю, там все зависит от ситуации. Я привел простой конкретный пример, для которого мускул работает безотказно. Как будет для такого примера работать оракл - хз.
     
  14. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Luge
    Показывает использование индекса ;)
     
  15. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    Dagdamor
    Код (Text):
    1. mysql> EXPLAIN SELECT * FROM `users` ORDER BY `US_ID` LIMIT 300, 5;
    2. +----+-------------+-------+-------+---------------+---------+---------+------+------+
    3. | id | select_type | table | type  | possible_keys | key     | key_len | ref  | rows |
    4. +----+-------------+-------+-------+---------------+---------+---------+------+------+
    5. |  1 | SIMPLE      | users | index | NULL          | PRIMARY | 4       | NULL |  428 |
    6. +----+-------------+-------+-------+---------------+---------+---------+------+------+
    таблица дырявая, правда.
    rows 428
     
  16. Хаааа!
    Пример таблички:
    [sql]CREATE TABLE IF NOT EXISTS `temp_table` (
    `id` int(11) NOT NULL auto_increment,
    `unq` int(11) NOT NULL,
    `indx` int(11) NOT NULL,
    `indx_null` int(11) default NULL,
    `t1` text NOT NULL,
    `t2` text NOT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `unq` (`unq`),
    KEY `indx` (`indx`),
    KEY `idx_null` (`indx_null`)
    ) ENGINE=MyISAM;
    [/sql]
    Генератор строк:
    PHP:
    1. <?php
    2. mysql_connect('localhost', 'temp','temp');
    3. $rct = 1000000;
    4. $lpt = 0;
    5. for ($i=0; $i<=$rct; $i++) {
    6.     mysql_query('insert into temp_table (unq, indx, indx_null, t1, t2) values ('.$i.','.rand(0,$i).','.(rand(0,1)==1?$i:'NULL').',\'record_'.$i.'\',\'text data\')') or die('error? '.mysql_error());
    7.     $cpt = round(($i/$rct)*100);
    8.     if ($cpt!=$lpt) {
    9.         echo 'inserted '.$cpt.'%, '.$i.' records.<br/>';
    10.         $lpt = $cpt;
    11.     }
    12. }
    13. ?>
    Запрос:
    [sql]EXPLAIN SELECT * FROM `temp_table` LIMIT 1, 30[/sql]
    дает нам...
    Код (Text):
    1.  
    2. mysql> select count(*) from temp_table;
    3. +----------+
    4. | count(*) |
    5. +----------+
    6. |  1000001 |
    7. +----------+
    8. 1 row in set (0.00 sec)
    9.  
    10. mysql> EXPLAIN SELECT * FROM `temp_table` LIMIT 1, 30;
    11. +----+-------------+------------+------+---------------+------+---------+------+---------+-------+
    12. | id | select_type | table      | type | possible_keys | key  | key_len | ref  | rows    | Extra |
    13. +----+-------------+------------+------+---------------+------+---------+------+---------+-------+
    14. |  1 | SIMPLE      | temp_table | ALL  | NULL          | NULL | NULL    | NULL | 1000001 |       |
    15. +----+-------------+------------+------+---------------+------+---------+------+---------+-------+
    16. 1 row in set (0.00 sec)
    17.  
    18. mysql>
     
  17. Продолжаем эксперименты:
    Код (Text):
    1. mysql> explain select * from temp_table where indx_null >3000 order by indx_null desc limit 4000, 30;
    2. +----+-------------+------------+-------+---------------+----------+---------+------+--------+-------------+
    3. | id | select_type | table      | type  | possible_keys | key      | key_len | ref  | rows   | Extra       |
    4. +----+-------------+------------+-------+---------------+----------+---------+------+--------+-------------+
    5. |  1 | SIMPLE      | temp_table | range | idx_null      | idx_null | 5       | NULL | 786513 | Using where |
    6. +----+-------------+------------+-------+---------------+----------+---------+------+--------+-------------+
    7. 1 row in set (0.00 sec)
    8.  
    9. mysql>
     
  18. Да, я был неправ. Даже использование ПК не спасает ситуацию. Заметьте, в селекте сейчас всего одно поле - ПК!

    Код (Text):
    1. mysql> explain select id from temp_table where id<500000 order by id limit 1000000, 1;
    2. +----+-------------+------------+-------+---------------+---------+---------+------+--------+--------------------------+
    3. | id | select_type | table      | type  | possible_keys | key     | key_len | ref  | rows   | Extra                    |
    4. +----+-------------+------------+-------+---------------+---------+---------+------+--------+--------------------------+
    5. |  1 | SIMPLE      | temp_table | range | PRIMARY       | PRIMARY | 4       | NULL | 530229 | Using where; Using index |
    6. +----+-------------+------------+-------+---------------+---------+---------+------+--------+--------------------------+
    7. 1 row in set (0.00 sec)
    8.  
    9. mysql>
     
  19. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    блин, не могу много читать, а можно вкраце, о чём спор?
     
  20. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
     
  21. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    аа так, вот оно что 0о
    Понятно, значит Олег использует Оракул а все остальные Мускуль?
    ну эт значит надолго...
     
  22. Я использую и то, и другое. Я пытаюсь показать, что не надо фетешировать на некоторые конструкции, и говорить «Мускул лучше, ведь в нем есть лимит!»
     
  23. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Просто надо с осторожность использовать limit, особенно, если проект нагруженный.
    Об этом есть на хабре статьи, называются mysql tricks (что-то вроде этого)
     
  24. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    флоппик
    Luge
    Дался вам этот эксплайн, тем более поле rows. Вы скорость замерьте.
    А что, есть возражения? ;) Ведь действительно лучше, ибо с ним удобнее. Что в качестве замены лимита предлагает Оракл - это что-то с чем-то. Вот там действительно выборка всей хрени целиком + отрезание лишнего.
     
  25. Неа. Оптимизатор учитывает в плане запроса то, что ты называешь хренью.

    Костыль он и в африке костыль...