MySQL中使用索引與不使用索引的區別
阿新 • • 發佈:2017-06-22
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中使用索引與不使用索引的區別