zoukankan      html  css  js  c++  java
  • mysql之索引查询2

    一 索引的创建

     索引减慢了 写的操作,优化了读取的时间

     index:普通索引,加速了查找的时间。

     fulltext:全文索引,可以选用占用空间非常大的文本信息的字段作为索引的字段。使用fulltext时需要借助第三方的软件sphinx专用去那问搜索。

     创建格式,创建表时加上索引:

      create table 表名(字段1 类型 约束键,。。。。。);

      create table 表名(字段1 类型,。。。。,约束键)

    mysql> create table t2(id int primary key auto_increment,
        ->                  name char(15) not null unique);
    Query OK, 0 rows affected (0.24 sec)
    
    mysql> desc t2;
    +-------+----------+------+-----+---------+----------------+
    | Field | Type     | Null | Key | Default | Extra          |
    +-------+----------+------+-----+---------+----------------+
    | id    | int(11)  | NO   | PRI | NULL    | auto_increment |
    | name  | char(15) | NO   | UNI | NULL    |                |
    +-------+----------+------+-----+---------+----------------+
    2 rows in set (0.01 sec)
    
    mysql> create table t3(id int,
        ->                  name char(15),
        ->                  index idx_id(id));
    Query OK, 0 rows affected (0.24 sec)
    
    mysql> desc t3;
    +-------+----------+------+-----+---------+-------+
    | Field | Type     | Null | Key | Default | Extra |
    +-------+----------+------+-----+---------+-------+
    | id    | int(11)  | YES  | MUL | NULL    |       |
    | name  | char(15) | YES  |     | NULL    |       |
    +-------+----------+------+-----+---------+-------+
    2 rows in set (0.01 sec)
    

     常用的索引约束键有:primary key    unique key,

       普通的索引有:index

     创建表后指定字段为索引字段:

      create index 起名 on 表名(字段名);

      alter table 表名 add index 起名(字段名);mysql

    mysql> create table t4(id int ,
        ->                  name char(15));
    Query OK, 0 rows affected (0.25 sec)
    
    mysql> create table t5(id int,
        ->                  name char(15));
    Query OK, 0 rows affected (0.33 sec)
    
    mysql> desc t4;
    +-------+----------+------+-----+---------+-------+
    | Field | Type     | Null | Key | Default | Extra |
    +-------+----------+------+-----+---------+-------+
    | id    | int(11)  | YES  |     | NULL    |       |
    | name  | char(15) | YES  |     | NULL    |       |
    +-------+----------+------+-----+---------+-------+
    2 rows in set (0.03 sec)
    
    mysql> create index idx_id on t4(id);
    Query OK, 0 rows affected (0.25 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> desc t4;
    +-------+----------+------+-----+---------+-------+
    | Field | Type     | Null | Key | Default | Extra |
    +-------+----------+------+-----+---------+-------+
    | id    | int(11)  | YES  | MUL | NULL    |       |
    | name  | char(15) | YES  |     | NULL    |       |
    +-------+----------+------+-----+---------+-------+
    2 rows in set (0.01 sec)
    
    mysql> alter table t5 add index idx_id(id);
    Query OK, 0 rows affected (0.19 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> desc t5;
    +-------+----------+------+-----+---------+-------+
    | Field | Type     | Null | Key | Default | Extra |
    +-------+----------+------+-----+---------+-------+
    | id    | int(11)  | YES  | MUL | NULL    |       |
    | name  | char(15) | YES  |     | NULL    |       |
    +-------+----------+------+-----+---------+-------+
    2 rows in set (0.01 sec)
    

     删除索引:

      drop index 索引名 on 表名

      删除主键:alter table 表名 drop primary key;

    mysql> desc t4;
    +-------+----------+------+-----+---------+-------+
    | Field | Type     | Null | Key | Default | Extra |
    +-------+----------+------+-----+---------+-------+
    | id    | int(11)  | YES  | MUL | NULL    |       |
    | name  | char(15) | YES  |     | NULL    |       |
    +-------+----------+------+-----+---------+-------+
    2 rows in set (0.01 sec)
    
    mysql> drop index idx_id on t4;
    Query OK, 0 rows affected (0.16 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> desc t4;
    +-------+----------+------+-----+---------+-------+
    | Field | Type     | Null | Key | Default | Extra |
    +-------+----------+------+-----+---------+-------+
    | id    | int(11)  | YES  |     | NULL    |       |
    | name  | char(15) | YES  |     | NULL    |       |
    +-------+----------+------+-----+---------+-------+
    

    二 测试

     比较符号的测试:<   >   =   !=  >=  <=

    mysql> desc s1;
    +--------+-------------+------+-----+---------+-------+
    | Field  | Type        | Null | Key | Default | Extra |
    +--------+-------------+------+-----+---------+-------+
    | id     | int(11)     | YES  |     | NULL    |       |
    | name   | varchar(20) | YES  |     | NULL    |       |
    | gender | char(6)     | YES  |     | NULL    |       |
    | email  | varchar(50) | YES  |     | NULL    |       |
    +--------+-------------+------+-----+---------+-------+
    4 rows in set (0.01 sec)
    
    mysql> select count(*) from s1 where id=370000;
    +----------+
    | count(*) |
    +----------+
    |        1 |
    +----------+
    1 row in set (0.17 sec)
    
    mysql> create index idx_id on s1(id);
    Query OK, 0 rows affected (1.17 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> select count(*) from s1 where id=370000;
    +----------+
    | count(*) |
    +----------+
    |        1 |
    +----------+
    1 row in set (0.00 sec)
    
    mysql> select count(*) from s1 where id>370000;
    +----------+
    | count(*) |
    +----------+
    |     6220 |
    +----------+
    1 row in set (0.00 sec)
    
    mysql> select count(*) from s1 where id<370000;
    +----------+
    | count(*) |
    +----------+
    |   369999 |
    +----------+
    1 row in set (0.21 sec)
    
    mysql> select count(*) from s1 where id!=370000;
    +----------+
    | count(*) |
    +----------+
    |   376219 |
    +----------+
    1 row in set (0.20 sec)
    
    mysql> drop index idx_id on s1;
    Query OK, 0 rows affected (0.13 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> create index idx_name on s1(name);
    Query OK, 0 rows affected (2.19 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> desc s1;
    +--------+-------------+------+-----+---------+-------+
    | Field  | Type        | Null | Key | Default | Extra |
    +--------+-------------+------+-----+---------+-------+
    | id     | int(11)     | YES  |     | NULL    |       |
    | name   | varchar(20) | YES  | MUL | NULL    |       |
    | gender | char(6)     | YES  |     | NULL    |       |
    | email  | varchar(50) | YES  |     | NULL    |       |
    +--------+-------------+------+-----+---------+-------+
    4 rows in set (0.01 sec)
    
    mysql> select count(*) from s1 where name='egon';
    +----------+
    | count(*) |
    +----------+
    |   376220 |
    +----------+
    1 row in set (0.25 sec)
    
    mysql> select count(*) from s1 where name='xxxx';
    +----------+
    | count(*) |
    +----------+
    |        0 |
    +----------+
    1 row in set (0.00 sec)
    

    注意事项:插入索引过和如果添加记录会改变树形的结构。

      如果一个字段的重复率过高,如果条件成立,反而会拖慢查询的效率。如果条件不成立,查询时间会非常的块

      尽量选择区分度较高的字段作为索引的字段。一般是在十条记录中有一条重复。

      索引的字段不能够参与计算中,因为这样条件就不会明确,所以也要从第一条记录开始计算,这样就增大了查找的范围。这样也会非常耗时间的。

     逻辑符号的测试:  and  or  not 

    mysql> desc s1;
    +--------+-------------+------+-----+---------+-------+
    | Field  | Type        | Null | Key | Default | Extra |
    +--------+-------------+------+-----+---------+-------+
    | id     | int(11)     | YES  |     | NULL    |       |
    | name   | varchar(20) | YES  | MUL | NULL    |       |
    | gender | char(6)     | YES  |     | NULL    |       |
    | email  | varchar(50) | YES  |     | NULL    |       |
    +--------+-------------+------+-----+---------+-------+
    4 rows in set (0.01 sec)
    
    mysql> create index idx_id on s1(id);
    Query OK, 0 rows affected (1.69 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> desc s1;
    +--------+-------------+------+-----+---------+-------+
    | Field  | Type        | Null | Key | Default | Extra |
    +--------+-------------+------+-----+---------+-------+
    | id     | int(11)     | YES  | MUL | NULL    |       |
    | name   | varchar(20) | YES  | MUL | NULL    |       |
    | gender | char(6)     | YES  |     | NULL    |       |
    | email  | varchar(50) | YES  |     | NULL    |       |
    +--------+-------------+------+-----+---------+-------+
    4 rows in set (0.01 sec)
    
    mysql> select * from s1 where id=370000 and name='egon';
    +--------+------+--------+-------------------+
    | id     | name | gender | email             |
    +--------+------+--------+-------------------+
    | 370000 | egon | male   | egon370000@oldboy |
    +--------+------+--------+-------------------+
    1 row in set (0.00 sec)
    
    mysql> select count(*) from s1 where name='egon' and id=370000;
    +----------+
    | count(*) |
    +----------+
    |        1 |
    +----------+
    1 row in set (0.00 sec)
    
    mysql> select count(*) from s1 where name='egon' or id=370000;
    +----------+
    | count(*) |
    +----------+
    |   376220 |
    +----------+
    1 row in set (0.83 sec)
    
    mysql> select count(*) from s1 where id=370000 or name='egon';
    +----------+
    | count(*) |
    +----------+
    |   376220 |
    +----------+
    1 row in set (0.79 sec)
    

     在and的查找中:从左到右首先找到索引区分高的索引字段,如果条件成立,在去按照索引的字段去查找,如果不成立,就不会再去查找。and前面查找的条件如果不成立,那么查找的顺序就会非常的块,如果and前面的索引字段区分度低或者查找的范围大,同样也是耗费时间的,查找效率也会很低的。

     在or的查找中:从左到右一次查找记录,如果前面的条件成立,就不会查找后面的条件,如果前面的条件不成立,才会查找后面的条件。如果查找的索引字段区分度低,还是会拉低查找效率的,如果查找的索引字段区分度高的话,那就要看查找的范围,如果查找的范围过大,效率还是不会提升的,如果明确一个条件,或着范围小,这样就会提升查找的效率。

     范围的比较:in   between  like 

    mysql> select count(*) from s1 where id in (213,54343,354544);
    +----------+
    | count(*) |
    +----------+
    |        3 |
    +----------+
    1 row in set (0.00 sec)
    
    mysql> select count(*) from s1 where id between 100 and 3000;
    +----------+
    | count(*) |
    +----------+
    |     2901 |
    +----------+
    1 row in set (0.00 sec)
    
    mysql> select count(*) from s1 where id between 100 and 370000;
    +----------+
    | count(*) |
    +----------+
    |   369901 |
    +----------+
    1 row in set (0.19 sec)
    
    mysql> select count(*) from s1 where id not in (1232,3423,24324);
    +----------+
    | count(*) |
    +----------+
    |   376217 |
    +----------+
    1 row in set (0.20 sec)
    

     联合索引的测试:and  or 

      联合索引就是将需要判断的字段联合起来创建一个索引。联合索引都是后面的字段联合第一个的。

    mysql> desc s1;
    +--------+-------------+------+-----+---------+-------+
    | Field  | Type        | Null | Key | Default | Extra |
    +--------+-------------+------+-----+---------+-------+
    | id     | int(11)     | YES  |     | NULL    |       |
    | name   | varchar(20) | YES  |     | NULL    |       |
    | gender | char(6)     | YES  |     | NULL    |       |
    | email  | varchar(50) | YES  |     | NULL    |       |
    +--------+-------------+------+-----+---------+-------+
    4 rows in set (0.01 sec)
    
    mysql> create index idx_xxx on s1(name,gender,id,email);
    Query OK, 0 rows affected (3.19 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> desc s1;
    +--------+-------------+------+-----+---------+-------+
    | Field  | Type        | Null | Key | Default | Extra |
    +--------+-------------+------+-----+---------+-------+
    | id     | int(11)     | YES  |     | NULL    |       |
    | name   | varchar(20) | YES  | MUL | NULL    |       |
    | gender | char(6)     | YES  |     | NULL    |       |
    | email  | varchar(50) | YES  |     | NULL    |       |
    +--------+-------------+------+-----+---------+-------+
    4 rows in set (0.01 sec)
    
    
    mysql> select count(*) from s1 where name='egon' and gender='male' and id>3000 and email='xxx';
    +----------+
    | count(*) |
    +----------+
    |        0 |
    +----------+
    1 row in set (0.49 sec)
    
    mysql> select count(*) from s1 where name='egon' and gender='male' and email='xxx' and id>3000;
    +----------+
    | count(*) |
    +----------+
    |        0 |
    +----------+
    1 row in set (0.49 sec)
    
    mysql> select count(*) from s1 where name='egon' and gender='male' and email='xxx' and id=3000;
    +----------+
    | count(*) |
    +----------+
    |        0 |
    +----------+
    1 row in set (0.00 sec)
    
    mysql> select count(*) from s1 where name='egon' and gender='male' and id=3000;
    +----------+
    | count(*) |
    +----------+
    |        1 |
    +----------+
    1 row in set (0.00 sec)
    
    mysql> select count(*) from s1 where name='egon' and id=370000 and gender='male';
    +----------+
    | count(*) |
    +----------+
    |        1 |
    +----------+
    1 row in set (0.00 sec)
    
    mysql> select count(*) from s1 where name='egon' and gender='male' and email='xxx';
    +----------+
    | count(*) |
    +----------+
    |        0 |
    +----------+
    1 row in set (0.46 sec)
    
    mysql> select count(*) from s1 where name='egon' and id=370000 and email='xxx';
    +----------+
    | count(*) |
    +----------+
    |        0 |
    +----------+
    1 row in set (0.30 sec)
    

     注意:如果联合索引的字段条件没有连续出现的话也会拖慢速度的。

      什么叫做最左前缀:联合索引的查找顺序是从左到右依次查找,如果是and,查找出区分度高的索引字段先执行,如果条件成立在执行其他的条件,如果不成立,就不会执行其他的条件;如果是or,从左到右依次执行,如果条件成立就不会在去执行其他的索引条件。

     注意事项:应该将明确的条件字段放在右范围的条件字段的前面。

          排序字段必须是索引字段。

          对于联合索引,只要有第一个联合索引的字段,就会起作用,如果没有,就不会有效果。

     覆盖索引只要有联合索引的第一个字段就可以使用

     合并索引:创建多个单列索引,他们可以合并的使用,也可以单个使用。

    详细资料访问:http://www.cnblogs.com/linhaifeng/articles/7274563.html#_label7

  • 相关阅读:
    ffmpeg 视频ts切片生成m3u8
    ffmpeg细节整理记录
    网页前端video播放m3u8(HLS)
    ffmpeg 常用知识点收集
    网络视频m3u8解密及ts文件合并
    DNS地址列表
    mysqladmin 命令详解
    Linux安装MySQL
    MySQL常用权限操作
    linux 常用端口
  • 原文地址:https://www.cnblogs.com/fangjie0410/p/7762673.html
Copyright © 2011-2022 走看看