发表于: 2017-09-08 23:03:53

1 870



今日完成

1:学习索引类型以及区别;

2:在MySQL中操作索引的建立以及删除语句;

3:试着深度思考MySQL的相关问题。

 

明日计划:

1:阅读学习了解Java相关概念理论知识;

2:了解Maven3,Eclipse以及IDEA的概念,下载并配置相应的环境变量;

3:试着学习验证MySQL缓存的机制 ;

4:学习插入百万计数据,验证昨天遗留的索引效率问题。

 

 收获:

1:索引类型及其区别;

普通索引:INDEX就是最基本的索引,没有限制;(name)

唯一索引;UNIQUE INDEX索引的列值必须唯一,可以为空,若是组合索引则列值组合唯一;(slogan)

主键索引;PRIMARY KEY就是特殊的索引,不允许为空。(Id)

这就是索引的三大类型,与唯一索引的列值唯一,主键索引的特殊相比较而言,普通索引就普通在没有限制,而主键索引之所以特殊是体现在,每一个表都设定有自己的主键,这也就自动定义为主键索引了。

 

2:单列索引和组合索引;

单列索引;就是一个只包含一列的索引,对于有n列的表可以建立n个单列索引,但是n个列单列索引并不是组合索引;

mysql> alter table entroll add index (name);

Query OK, 0 rows affected, 1 warning (0.36 sec)

Records: 0  Duplicates: 0  Warnings: 1

 

组合索引是包含多列的一个索引。组合索引的查询效率是远远高于单列索引的,但是建立组合索引有一定的原则“最左原则”,就是如果abc三列的索引,只有abc和ab以及c三种组合索引;至于怎么排列组合索引的列顺序,可以通过各列的离散度来确定,用唯一值语句来判定;select count(distinct 列),count(distinct 列)from table其中唯一值越多离散度越好,则选择性更好应该放在组合索引的前列。

mysql> create index qq_name on me (qq, name);

Query OK, 0 rows affected (0.54 sec)

Records: 0  Duplicates: 0  Warnings: 0

 

唯一值确定的select语句;

mysql> select count(distinct education),count(distinct name) from entroll;

1 row in set (0.00 sec)


根据结果可知列edu的离散度小于name,若where语句为name=y and edu=x时的组合索引name应放在前排即index(name,edu)的效率会高于index(edu, name)

从表中也可看出,每一列的重复值越多,离散度越小。而同理,任务一中要求给姓名建立索引之外,还可以给学号建立索引,因为每个人的名字和学号是不同的,这样离散值度大的索引sql执行效率会更高。

 

3:索引相关的sql语句;

用create index创建索引

mysql> create index slogan on entroll(slogan);

Query OK, 0 rows affected (0.57 sec)

Records: 0  Duplicates: 0  Warnings: 0

 

用alter table修改表结构

mysql> alter table entroll add index (name);

Query OK, 0 rows affected, 1 warning (0.36 sec)

Records: 0  Duplicates: 0  Warnings: 1

 

用create table是建表时直接指定

mysql> create table me (id int ,qq int,name varchar(10), primary key(id));

Query OK, 0 rows affected (0.57 sec)

 

用drop index删除索引并且用show语句验证

mysql> drop index name on entroll;

Query OK, 0 rows affected (0.48 sec)

Records: 0  Duplicates: 0  Warnings: 0

 

4:给姓名建立索引,插入是十条数据,发现sql执行效率一致,应该是数据太少的原因;

mysql>  insert into entroll values

(0 ,'ios','2017.6','adgffd','2879',’ghd','啦啦','李师兄','掘金','杜大'),

    '> (0 ,'objective','2017.6','adggh','67','jhf','啦啦啦啦啦啦阿','赵师兄','开发者头条','杜小'),

    '> (0 ,'PHP','2019.6','a','56447898','hkjhkjhk','哦哦','孙师兄','新浪','杜小小')

Query OK, 0 rows affected (0.56 sec)

Records: 0  Duplicates: 0  Warnings: 0

 

mysql> select *from entroll where name ='杜大大';

+----+--------+---------+-----------+----------+----------+--------+-----------+---------+-----------+

| ID | target | launch  | education | study_id | daily_ur | slogan | brother   | channel | name      |

+----+--------+---------+-----------+----------+----------+--------+-----------+---------+-----------+

|  2 | java   | 2017.06 | aa        | 254      | gdfgd    | 哈哈   | 张师兄    | 微博    | 杜大大    |

+----+--------+---------+-----------+----------+----------+--------+-----------+---------+-----------+

1 row in set (0.00 sec)

 

mysql> select *from entroll where name ='';

+----+--------+--------+-----------+----------+----------+--------+-----------+---------+------+

| ID | target | launch | education | study_id | daily_ur | slogan | brother   | channel | name |

+----+--------+--------+-----------+----------+----------+--------+-----------+---------+------+

|  6 | css    | 2017.3 | ee        | 63       | a        |      | 董师兄    | 博客    |    |

+----+--------+--------+-----------+----------+----------+--------+-----------+---------+------+

1 row in set (0.00 sec)

 

mysql> select *from entroll where target='objective';

+----+-----------+--------+-----------+----------+----------+------------------------+-----------+-----------------+--------+

| ID | target    | launch | education | study_id | daily_ur | slogan                 | brother   | channel         | name   |

+----+-----------+--------+-----------+----------+----------+------------------------+-----------+-----------------+--------+

|  8 | objective | 2017.6 | adggh     | 67       | jhf      | 啦啦啦啦啦 啦阿        | 赵师兄    | 开发者头条      | 杜小   |

+----+-----------+--------+-----------+----------+----------+------------------------+-----------+-----------------+--------+

1 row in set (0.00 sec)

 

5:关于索引以及MySQL的思考;

索引就像目录一样,会大大提高mysql的搜寻效率,因此对于MySQL中的一些语句如:where语句order语句以及on语句就需要建立相关最优的索引语句以提高查询效率。这里说最优的索引是因为,并不是索引越多效率就越高,计算机执行时会在一些不必要的索引上浪费时间,就像建立的组合索引里包含主键索引,这种就是冗余部分,会在一定程度上降低查询效率;同时索引越多也会拉低表格的写入效率如:insert,delete,update等,因为MySQL不仅要保存更新这些数据,还要处理建好的索引数据。因此,建立索引要选出最优的索引配合最优的查询语句,来共同提高SQL执行的效率。

 




返回列表 返回列表
评论

    分享到