Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > Что влияет на скорость выполнения запроса?


Автор: vngr6 8.2.2017, 15:55
Используется:
    Комп: 
       - 2,6Ггц
       - 6,0 Гб ОЗУ
       - Win 7x64
    
    Программы: 

        - OpenServer
        - Access - 2016
        - MySql 5.7 x 64
        - Odbc - mysql-connector-odbc-5.3.7-winx64

    Всё установлено и используется на одном компьютере

Характеристики таблицы:
- кол строк предполагается  - больше 1,0 млн 
- количество столбцов ~ 20 штук
        
        Таблица  (tbl8)
        Кол. строк  - 12 425 строк
        Объём  - 24,6 Мб

Код

        CREATE TABLE `tbl5` (
            `id` INT(11) NOT NULL AUTO_INCREMENT,
            `tbl` LONGTEXT NULL,
            `idsub` INT(20) NOT NULL,
            `pol_3` INT(11) NULL DEFAULT NULL,
            `pol_4` LONGTEXT NULL,
            `pol_5` LONGTEXT NULL,
            `pol_6` LONGTEXT NULL,
            `pol_7` LONGTEXT NULL,
            `pol_8` LONGTEXT NULL,
            `pol_9` LONGTEXT NULL,
            `pol_10` LONGTEXT NULL,
            `pol_11` LONGTEXT NULL,
            `pol_12` LONGTEXT NULL,
            `pol_13` LONGTEXT NULL,
            `pol_14` LONGTEXT NULL,
            `pol_15` LONGTEXT NULL,
            `pol_16` LONGTEXT NULL,
            `pol_17` LONGTEXT NULL,
            UNIQUE INDEX `id` (`id`)
        )
        COLLATE='utf8_general_ci'
        ENGINE=InnoDB
        AUTO_INCREMENT=240013
        ;



        В таблице тип полей "LONGTEXT" принят как предварительный, для проверки работы базы... Потом полям будут присвоены необходимые типы: LONGTEXT, TEXT, числа, даты и т.д. В полях: pol_9, pol_10, pol_11 используется много строчный текст более 1 000 символов. В остальных полях просто текст "ТЕКСТ _ ЗАПИСИ pol_n"
        
        
        
        
    Запрос
    Выполняем запрос в программе HeidiSql из таблицы tbl8

Код

    select*
    from
        `01tst`.`tbl8`
    where
        (
            `01tst`.`tbl8`.`idsub` = 2
        ) 


    Запрос выполняется  2 сек.
    Когда количество строк достигает более 100 000 - длительность выполнения запроса 40 сек.

Вопрос
Как уменьшить длительность выполнения запроса?
Что влияет на длительность выполнения запроса?


Автор: Zloxa 8.2.2017, 16:12
Цитата(vngr6 @  8.2.2017,  16:55 Найти цитируемый пост)
Как уменьшить длительность выполнения запроса?

если предикат по idsub достаточно селективен и нет к тому противопоказаний - проиндексировать idsub
Цитата(vngr6 @  8.2.2017,  16:55 Найти цитируемый пост)
Что влияет на длительность выполнения запроса?

длительность выполнения операций, необходимых для его исполнения  smile 

Автор: vngr6 8.2.2017, 16:18
Цитата(Zloxa @  8.2.2017,  16:12 Найти цитируемый пост)
если idsub достаточно селективен - проиндексировать его

Что такое "селективен"?
Там постоянно повторяются числа от 1 - 35
См. скрин  http://prntscr.com/e6286a

Автор: Akina 8.2.2017, 16:46
Цитата(vngr6 @  8.2.2017,  17:18 Найти цитируемый пост)
Там постоянно повторяются числа от 1 - 35

То есть селективность его порядка 3%, индексация по этому полю - разумна.

Автор: Zloxa 8.2.2017, 17:57
Цитата(vngr6 @  8.2.2017,  17:18 Найти цитируемый пост)
Что такое "селективен"?

Селективным(высокоселективным) называется предикат, для которого коэффициент селективности низок. Коэффициент селективности рассчитывается как отношение количества записей, отобранных по предикату к исходному количеству записей. Наиболее селективен тот предикат, чей коэффициент селективности устремляется к нулю. Наименее селективен тот предикат, чей коэффициент селективности устремляется к единице. 

Цитата(vngr6 @  8.2.2017,  17:18 Найти цитируемый пост)
Там постоянно повторяются числа от 1 - 35

Здесь важно не то, сколько значений может принимать столбец, а сколько будет возвращено записей по конкретному значению. Если распределение данных таково, что по значению 2 будет отобрано 10 записей из 1кк, то предикат можно считать достаточно селективным и индексный доступ по этому предикату будет оправдан. Если по значению 2 будет возвращено 100к из 1кк, индексный доступ может оказаться не эффективным и, используя его запрос будет выполняться еще дольше.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)