MySQL中使用索引与不使用索引的区别

为了回答索引对数据库性能的影响,做了一次简单的实验。

测试环境

   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性能。

时间: 2024-10-26 11:48:16

MySQL中使用索引与不使用索引的区别的相关文章

mysql中如何查看和删除唯一索引

mysql中如何查看和删除唯一索引. 查看唯一索引: show index from mytable;//mytable 是表名 查询结果如下: 查询到唯一索引后,如何删除唯一索引呢,使用如下命令: alter table mytable drop index mdl_tag_use_ix;//mdl_tag_use_ix是上表查出的索引名,key_name mysql中如何查看和删除唯一索引,布布扣,bubuko.com

mysql中怎样查看和删除唯一索引

mysql中怎样查看和删除唯一索引. 查看唯一索引: show index from mytable;//mytable 是表名 查询结果例如以下: 查询到唯一索引后,怎样删除唯一索引呢,使用例如以下命令: alter table mytable drop index mdl_tag_use_ix;//mdl_tag_use_ix是上表查出的索引名,key_name mysql中怎样查看和删除唯一索引

MySQL 中 key, primary key ,unique key,index的区别

一.key与primary key区别 CREATE TABLE wh_logrecord ( logrecord_id int(11) NOT NULL auto_increment, user_name varchar(100) default NULL, operation_time datetime default NULL, logrecord_operation varchar(100) default NULL, PRIMARY KEY (logrecord_id), KEY wh

Mysql中的排序规则utf8_unicode_ci、utf8_general_ci的区别总结

Mysql中的排序规则utf8_unicode_ci.utf8_general_ci的区别总结 用了这么长时间,发现自己竟然不知道utf_bin和utf_general_ci这两者到底有什么区别.. ci是 case insensitive, 即 "大小写不敏感", a 和 A 会在字符判断中会被当做一样的; bin 是二进制, a 和 A 会别区别对待. 例如你运行: SELECT * FROM table WHERE txt = 'a' 那么在utf8_bin中你就找不到 txt

MySQL中0、&#39;0&#39;作为条件时的区别

一.现象: 今天查询时,某字段x为varchar 可能的值为A B C 0 1 2 3 4 想把0 1 2 3 4的所有数据查出,使用的SQL为 select * from table where x in (0,1,2,3,4) 结果发现,会把所有数据都查出 但是,使用 select * from table where x in ('0',1,2,3,4) 查出数据即为正常数据 二.原因: 经查阅,默认情况下,MySQL会尽量进行类型转换 所以,当字符串转为整数时,如A.B.C这种值会转换失

mysql中,主键与普通索引

一.什么是索引?索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录.表里面的记录数量越多,这个操作的代价就越高.如果作为搜索条件的列上已经创建了索引,MySQL无需扫描任何记录即可迅速得到目标记录所在的位置.如果表有1000个记录,通过索引查找记录至少要比顺序扫描记录快100倍. 假设我们创建了一个名为people的表: CREATE TABLE people ( pe

mysql中条件查询加排序和索引的关系

跟一个朋友,不错公司的主管交流时,对于mysql中条件查询和排序时 与索引的关系 mysql> explain select * from article where title='希望光伏企业挺过2个月' o rder by id desc\\\\\\\\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: article type: index pos

浅析MySQL中的Index Condition Pushdown (ICP 索引条件下推)和Multi-Range Read(MRR 索引多范围查找)查询优化

本文出处:http://www.cnblogs.com/wy123/p/7374078.html(保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错误进行修正或补充,无他) ICP优化原理 Index Condition Pushdown (ICP),也称为索引条件下推,体现在执行计划的上是会出现Using index condition(Extra列,当然Extra列的信息太多了,只能做简单分析)ICP原理通俗讲就是,查询过程中,直接在查询引擎

mysql中innodb和myisam对比及索引原理区别(转)

InnoDB和MyISAM是很多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,5.7之后就不一样了 1.事务和外键 InnoDB具有事务,支持4个事务隔离级别,回滚,崩溃修复能力和多版本并发的事务安全,包括ACID.如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能 MyISAM管理非事务表.它提供高速存储和检索,以及全文搜索能力.如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择 2.全文索引 I

【转】Mysql中的排序规则utf8_unicode_ci、utf8_general_ci的区别总结

Mysql中utf8_general_ci与utf8_unicode_ci有什么区别呢?在编程语言中,通常用unicode对中文字符做处理,防止出现乱码,那么在MySQL里,为什么大家都使用utf8_general_ci而不是utf8_unicode_ci呢? 用了这么长时间,发现自己竟然不知道utf_bin和utf_general_ci这两者到底有什么区别..ci是 case insensitive, 即 "大小写不敏感", a 和 A 会在字符判断中会被当做一样的;bin 是二进制