Оптимизация boolean

 
0
 
MySQL
ava
tishaishii | 11.12.2016, 12:44
Таблица:

DELIMITER $$

CREATE TABLE `test` (
  `id` int(7) NOT NULL AUTO_INCREMENT,
  `val` int(7) NOT NULL DEFAULT '0',
  `bool` tinyint(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `val` (`val`)
) ENGINE=MyISAM AUTO_INCREMENT=1000001 DEFAULT CHARSET=utf8 $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `fill_test`()
BEGIN
    DECLARE `v_i` BIGINT( 20 ) UNSIGNED DEFAULT 1e6 ;

    WHILE ( `v_i` > 0 ) DO
        SET `v_i` = `v_i` - 1 ;
        
        INSERT INTO
            `test`
        SET
                `val` = rand( ) * 10000 ,
                `bool` = rand( ) * 2 ;
    END WHILE ;
END $$

CALL `fill_test`( ) $$

DELIMITER ;


Запрос:

SET profiling = true ;
SELECT
    `t1`.*
FROM
    `test` AS `t1`
WHERE
    ( `t1`.`val` > 1 ) ;
SHOW PROFILES ;

-- выводит 0.05080000

EXPLAIN
SELECT
    `t1`.*
FROM
    `test` AS `t1`
WHERE
    ( `t1`.`val` > 1 ) ;

/*
Выводит:
# id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra
1, SIMPLE, t1, ALL, val, , , , 1000000, Using where
*/


Запрос:

SET profiling = true ;
SELECT
    `t1`.*
FROM
    `test` AS `t1`
WHERE
    ( `t1`.`val` > 1 ) ;
SHOW PROFILES ;

-- выводит 0.0.05997800

EXPLAIN
SELECT
    `t1`.*
FROM
    `test` AS `t1`
WHERE
    ( `t1`.`bool` IS true ) ;
/*
Выводит: 
# id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra
1, SIMPLE, t1, ALL, , , , , 1000000, Using where
*/


В обоих случаях выводит: "Using where" и время выполнения запроса с индексом и с полным перебором отличается всего на 15%.

Как оптимизировать значение типа BOOLEAN ( 1|0 ) = TINYINT( 1 )?
Вроде бы, дело не в энтропии значений, получается.
Kommentare (4)
ava
Akina | 11.12.2016, 22:10 #
Я чёта хреново понимаю, что тут делается... какие индексы. если селективность оных не меньше половины?
ava
tishaishii | 16.12.2016, 22:21 #
Цитата (Akina @ 11.12.2016,  22:10)
Я чёта хреново понимаю, что тут делается... какие индексы. если селективность оных не меньше половины?

Ну что? Ответов нет?
ava
_zorn_ | 21.12.2016, 17:17 #
Цитата (tishaishii @  17.12.2016,  05:21 findReferencedText)
Ответов нет?

Есть один. Но он вам не понравитса.
Со своими тараканами сами возитесь )

Вы скорей всего "эникей" который на все руки. Но это ваш выбор и т.п.
С каждой ситуацией надо возитьса, разбиратьса и т.п.
НИКТО этого не будет делать просто так (если ситуация не стандартная типа "поменяйте в конфиге")

Разбирать запросы - давно "нестандартная ситуация"
EXPLAIN перед запросом могу посоветовать. Не понятно - шуруйте к эксмертам. ВСЕ.
Рынок так работает.
ava
Zloxa | 21.12.2016, 21:26 #
_zorn_, Не о чем тут разбираться, "возитьса". Ответ на вопрос дан (Хоть и оформлен как вопрос и совсем не разжёван). Для низкоселективных предикатов индексный доступ по B-Tree индексам не эффективен. B-Tree так работает. Bitmap индексов в MySQL нет. Все. Тут больше не о чем говорить, нечего понимать. К экспертам ходить не надо.
Registrieren Sie sich oder melden Sie sich an, um schreiben zu können.
Unternehmen des Tages
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Mitwirkende
advanced
Absenden