1. 程式人生 > >MySQL中使用索引與不使用索引的區別

MySQL中使用索引與不使用索引的區別

pan 並發 並發數 table def ring primary innodb zab

為了回答索引對數據庫性能的影響,做了一次簡單的實驗。

測試環境

   MySQL 5.7.10 innodb 100萬隨機數據

表結構

CREATE TABLE `table1` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `col1` varchar(1000) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1000000 DEFAULT CHARSET=utf8;

生成隨機數據 ,並插入數據

  myql中 執行call insert_calues(10000);

CREATE  FUNCTION `rand_string`(n INT) RETURNS varchar(1000) CHARSET utf8
BEGIN
    DECLARE chars_str VARCHAR(100) DEFAULT ‘abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789‘;
    DECLARE return_str VARCHAR(1000) DEFAULT ‘‘;
    DECLARE i INT DEFAULT 0;
    WHILE i < n DO
        SET return_str = concat(return_str,substring(chars_str , FLOOR(1 + RAND()*62 ),1));
        SET i = i +1;
    END WHILE;
    RETURN return_str;
END;
DELIMITER ;;
CREATE  PROCEDURE `insert_values`( m INT)
BEGIN
  SET @i=1;

 WHILE @i<m DO
  INSERT INTO  TABLE1(col1) SELECT rand_string(10) ;
   SET @[email protected]+1;
 END WHILE;

 END;;
DELIMITER ;

測試方式

  shell 並發查詢

增加索引並測試

ALTER TABLE table1 ADD INDEX col1(col1(10));

#time bash    sql_test.sh
Time: 0

real    0m0.313s
user    0m0.308s
sys     0m0.129s

刪除索引並測試ALTER TABLE table1 DROP INDEX col1;

#time bash    sql_test.sh
Time: 10

real    0m9.989s
user    0m0.322s
sys     0m0.130s

測試使用的sql_test.sh內容如下

trap "exec 203>&-;exec 203<&-;exit 0" 2

mkfifo 203fifo
exec 203<>203fifo
rm -rf 203fifo

#控制並發數量,如n<=20代表並發20次
for((n=1;n<=20;n++))
    do
    echo >&203
done

start=`date "+%s"`

for i in {1..100} ;
    do

            read -u203
            {   
                key=$(openssl rand -base64 9)
                mysql test1 -e ‘select SQL_NO_CACHE id from table1 where col1 ="${key}"‘  

                echo >&203

            }&
 

done

wait
end=`date "+%s"`
echo "Time: `expr $end - $start`"

exec 203>&-
exec 203<&-

總結

使用索引時,能極大提高SQL性能。

MySQL中使用索引與不使用索引的區別