Как вы узнаёте количество записей в таблице?

     

    Only registered users can participate in poll. Log in, please.

    Как вы узнаёте количество записей в таблице?

    • 68.8%SELECT COUNT(*) FROM table;436
    • 5.0%SELECT COUNT(*) FROM table LIMIT 1;32
    • 2.2%SHOW TABLE STATUS FROM database WHERE Name = 'table';14
    • 1.6%SELECT TABLE_ROWS FROM TABLES WHERE TABLE_SCHEMA='database' AND TABLE_NAME = 'table'; (в information_schema)10
    • 9.0%Через ORM57
    • 13.4%Если вам необходима такая информация, то скорее всего у вас неправильная архитектура85
    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 46

      –2
      как бы зависит от движка (InnoDB vs MyISAM).
      имхо лучший выход — вешать триггеры на INSERT/DELETE и править метаданные таблицы.
        0
        Не совсем понятно зачем нужны триггеры?
          0
          в INSERT увеличиваем внутренний счетчик, в DELETE — уменьшаем.
          потом просто выводим данные этого счетчика, когда нужно узнать количество записей.
            +2
            А первый простейший вариант чем плох?
              +1
              Первый вариант оптимизирован только для MyIsam таблиц, для InnoDB он также по индексу будет идти и считать.
                0
                Вы думаете разработчики БД не учли это и тупо не возращают количество записей в индексе?
                  +1
                  в myisam количество строк хранится отдельно, в innodb надо посчитать сколько записей в индексе. с учетом того, что первичный индекс — кластерный, это может быть очень не быстрым делом.
                    0
                    А еще в случае наличия прав доступа на уровне строк, то нужно подсчитать число строк доступных данному пользователю…
                      +1
                      Они это учли и не возращают тупо количество записей в индексе, т.к. это количество не всегда совпадает с количеством строк из-за транзакций и т.п.
                    0
                    одно дело взять данные из метадаты таблицы, которые _всегда_ в памяти, другое — обращаться к дереву индексов, и смотреть сколько там элементов.
                    первое — либо быстрее, либо так же по скорости.
                    0
                    А если DELETE не одной записи?
                      +3
                      FOR EACH ROW
                +3
                Обращаю внимание, что SHOW TABLE STATUS FROM database WHERE Name = 'table'; для InnoDB возвращает примерное значение.
                • UFO just landed and posted this here
                    0
                    Угумц, но опрос тем и плох, что он не озвучивает цели этого па.

                    Для подавляющего большинства задач примерного значения будет достаточно, так что +1 вам и за тот вариант голосования :-)
                    –10
                    SELECT COUNT(*) FROM table WHERE is_delete = 0
                      +2
                      is_delete находится в индексе?
                        –4
                        Нет, вьюшки подсчета всех записей отрабатываются помесячно\поквартально, поэтому скорость не критична.
                        +7
                        есть_удалять
                        +11
                        Заранее прошу прощения если вопрос покажется глупым, но в чем принципиальное различие между первым и вторым вариантом? Второй работает быстрее?
                          +2
                          В большом количество советов в инете написано использовать LIMIT, так как это типа снижает нагрузку на БД. Вот народ и пихает везде, где может.
                          +1
                          Единственно когда мне надо знать общее количество записей — это при использовании limit.
                          Догадайтесь с одного раза как это сделать в мискле.
                            +8
                            Насколько я помню, SELECT COUNT(ID) FROM table; (или любое другое поле) быстрее, чем *
                              0
                              NULL значения не подсчитаются.
                                +5
                                PK редко бывает NULL
                                +1
                                Это неверно:
                                Пруф 1.
                                Пруф 2.
                                  0
                                  Но, честно говоря, спасибо за коментарий. У меня был изначально этот вариант в списке, но я решил не плодить так много вариантов.
                                    0
                                    с чего бы это? count(*) — специальная форма записи для подсчета количества строк, а не значений
                                      0
                                      Всё с точностью до наоборот.
                                        0
                                        Давайте уточним — это обычно истинно для MS SQL Server т.к. по PK строится индекс.

                                        В общем сценарии\ произвольной бд это может и не выполняться быстрее.
                                        +3
                                        SELECT SQL_CALC_FOUND_ROWS… FROM дальше_обычный_запрос
                                        Правда это не для всей таблицы, а для конкретного запроса.
                                        Узнавать количество для всей таблицы как-то не было надобности.
                                        +8
                                        Первый способ работает везде. Остальные от вариации поддержки стандарта и вендор специфик.
                                          0
                                          Небыло моего варианта! :)
                                          select reltuples from pg_class where relname='table';
                                            +1
                                            Дает не 100% результат, есть возможность что не будет хватать пару записей.
                                            Не работает для view.
                                              –4
                                              Та панятна, а дотошность свою приберегите для полезных дел :)
                                          • UFO just landed and posted this here
                                              0
                                              Судя по комментариям, мир SQL ограничивается двумя видами таблиц MySQL :-)
                                                0
                                                А механика примерно одна и та же, алсо опрос неявно про мускл.
                                                0
                                                Вопрос заинтриговал:

                                                SELECT COUNT(*) FROM `таблица`
                                                starting 0.000007
                                                checking query cache for query 0.000005
                                                checking privileges on cached 0.000003
                                                sending cached result to clien 0.000016
                                                logging slow query 0.000002
                                                cleaning up 0.000001

                                                SELECT COUNT(*) FROM `таблица` LIMIT 1
                                                starting 0.000007
                                                checking query cache for query 0.000004
                                                checking privileges on cached 0.000002
                                                sending cached result to clien 0.000016
                                                logging slow query 0.000002
                                                cleaning up 0.000001

                                                База 46,786,533 записей типа MyISAM объем 18.1 ГБ, при тестах нагрузка на сервер снята, т.е. оба результата сопоставимы. ИМХО большой разницы не увидел.
                                                  0
                                                  Так заинтриговал, что даже каменты выше не было времени почитать? В муисам общее количество строк в таблице хранится в метаданных, таблица может быть какого угодно размера — разницы не будет.
                                                  А мне вот еще интересно на основе каких теорий второй запрос может быть быстрее первого?

                                                Only users with full accounts can post comments. Log in, please.