索引用于快速找出在某个列中有一特定值的行。不使用索引,MySQL必须从第1条记录开始然后读完整个表直到找出相关的行。表越大,花费的时间越多。如果表中查询的列有一个索引,MySQL能快速到达一个位置去搜寻到数据文件的中间,没有必要看所有数据。注意如果你需要访问大部分行,顺序读取要快得多,因为此时我们避免磁盘搜索。
假如你用新华字典来查找“张”这个汉字,不使用目录的话,你可能要从新华字典的第一页找到最后一页,可能要花二个小时。字典越厚呢,你花的时间就越多。现在你使用目录来查找“张”这个汉字,张的首字母是z, z开头的汉字从900多页开始,有了这条线索,你查找一个汉字可能只要一分钟,由此可见索引的重要性。但是索引建的是不是越多越好呢,当然不是,如果一本书的目录分成好几级的话,我想你也会晕的。
//准备二张测试表 mysql>创建表“test_t”( →“id”int(11)不是零auto_increment, →“num”int (11) NOT NULL默认“0”, →‘d_num varchar (30) NOT NULL默认“0”, →主键(“id”) →)=MyISAM引擎默认字符集=utf8 AUTO_INCREMENT=1; 查询好,0行影响(0.05秒) mysql>创建表“test_test”( →“id”int(11)不是零auto_increment, →“num”int (11) NOT NULL默认“0”, →主键(“id”) →)=MyISAM引擎默认字符集=utf8 AUTO_INCREMENT=1; 查询好,0行影响(0.05秒)//创建一个存储过程,为插数据方便 mysql>分隔符| mysql>创建过程i_test (pa int(11),标签varchar (30)) →开始 →声明max_num int(11)默认100000; →声明我int默认0; →声明rand_num int; →声明double_num字符; → →如果标签!=' test_test ' →选择计数(id)从test_t max_num; →虽然我& lt;爸爸做的 →如果max_num & lt;100000年之后 →选择演员(rand() * 100无符号)rand_num; →选择concat (rand_num rand_num) double_num; →插入test_t (num d_num)值(rand_num double_num); →如果; →我=+ 1; →结束时; →其他的 →选择计数(id)从test_test max_num; →虽然我& lt;爸爸做的 →如果max_num & lt;100000年之后 →选择演员(rand() * 100无符号)rand_num; →插入test_test (num)值(rand_num); →如果; →我=+ 1; →结束时; →如果; →结束| 查询好,0行影响(0.00秒) mysql>分隔符; mysql>显示变量如“% pro %”;//查看一下,记录执行的分析是不是开启动了,默认是不开启的 + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + | | Variable_name |值 + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + |分析| | | profiling_history_size 15 | | | protocol_version 10 | | | slave_compressed_protocol | | + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + 4行集(0.00秒) mysql>设置分析=1;//开启后,是为了对比加了索引后的执行时间 查询好,0行影响(0.00秒)
<强> 1,单表数据太少,索引反而会影响速度强>
mysql>调用i_test (10 ' test_t ');//向test_t表插入10条件 查询好了,1行影响(0.02秒) mysql>选择从test_t num num !=0; mysql>解释选择num从test_t num !=0 \ G; * * * * * * * * * * * * * * * * * * * * * * * * * * * 1。行 *************************** id: 1 select_type:简单 表:test_t 类型:所有 possible_keys:零 关键:零 key_len:零 裁判:零 行:10 额外的:使用 1行集(0.00秒) 错误: 没有指定查询 mysql>创建索引num_2> mysql>调用i_test (10 ' test_test ');//向test_test表插入10条数据 查询好了,1行影响(0.02秒) mysql>选择一个解释。num num1, b。num num2从test_t离开加入测试 t_test a.num=b.num \ G和b; * * * * * * * * * * * * * * * * * * * * * * * * * * * 1。行 *************************** id: 1 select_type:简单 表: 类型:指数 possible_keys:零 关键:num_2 key_len: 4 裁判:零 行:10 额外的:使用索引 * * * * * * * * * * * * * * * * * * * * * * * * * * * 2。行 *************************** id: 1 select_type:简单 表:b 类型:裁判 possible_keys: num_1 关键:num_1 key_len: 4 裁判:bak_test.a。num//bak_test是数据库名,a.num是test_t的一个字段 行:1080 额外的:使用索引 2行集(0.01秒) 错误: 没有指定查询简单了解添加mysql索引的3条原则