发表于: 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执行的效率。
评论