简单了解添加mysql索引的3条原则

  

  

索引用于快速找出在某个列中有一特定值的行。不使用索引,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条原则