请大家关注 我的新家:www.taoyongpan.xin/2017/12/05/sql001/
大学生眼中的网站
我也是个大三的学生,绝对没有贬低的意思。
当我们知道自己被计算机学院录取的时候,我们都怀着好奇与忐忑的心情,开始了我们的大学;好奇的是:我们平常生活中使用的这些网站和APP都是怎么做出来的呢,我以后也是干这个的吗;忐忑的是:wco我平时就会打游戏和看视频,那些玩意我能学会吗,好起来逼格都好高啊。当我们刚开始接触代码时候的那种油然而生的装逼之心 ,忍不住发了个说说,告诉身边的人,我也是电视里那种用代码的人了;经过了一年的沉浮,我们大部分人都已经是开发小能手了,我们可以各种徒手做网站、APP,内心充满了雄心壮志,但是我们的网站的效率是怎样的的呢,有没有数据过万,加载速度就明显降低呢,我们应该怎么去提高我们的查询效率呢?缓存还是索引,这是一个问题。
使用缓存是一种方法,现在比较火的有Redis和Memcached,但是当处理一些动态数据的时候,我们的缓存方法肯定会出现问题,我会在另一篇博客中重点讲解一下;本篇主要是用的是数据库索引;
随机生成一百万数据
我们使用数据库索引是为了处理大数据问题的,可是我们 没有数据啊,这可真是难倒了一堆好汉;但是大哥们,我们要注意的时候,计算机多少数据不可以自动生成,他可是我们的傻兄弟啊,那咱们就来教一下这个傻傻的小兄弟,先生成个一百万的数据:
创建一个简单的用户表
CREATE TABLE `t_user_memory` ( `id` INT (11) NOT NULL AUTO_INCREMENT, `username` VARCHAR(50) NOT NULL DDEFAULT '', `password` VARCHAR(50) NOT NULL DDEFAULT '', PRIMARY KEY (`id`), ) ENGINE = MEMORY AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8 ;
依次执行下面的操作:
1、随机产生长度为n的字符串的函数:
CREATE FUNCTION `rand_str`(n INT) RETURNS varchar(255) CHARSET latin1 BEGIN DECLARE chars_str varchar(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; DECLARE return_str varchar(255) DEFAULT '' ; DECLARE i INT DEFAULT 0; WHILE i < n DO SET return_str = concat(return_str,substring(chars_str , FLOOR(1 + RAND()*62 ),1)); SET i = i +1; END WHILE; RETURN return_str; END
2、向数据库中添加n条数据的函数:
CREATE PROCEDURE `add_user`(IN n int) BEGIN DECLARE i INT DEFAULT 1; WHILE (i <= n ) DO INSERT into t_user_memory (username,password) VALUES (rand_str(20),rand_str(20)); set i=i+1; END WHILE; END
3、调用插入函数,并插入一百万的数据:
CALL add_user(1000000)
简单暴力,一百万数据添加完毕 ,我们可以根据自己的需要改变插入条数的大小;
创建数据库索引
普通索引
这是最基本的索引类型,而且它没有唯一性之类的限制;
1、创建
CREATE INDEX indexId ON t_user_memory(id)
2、索引的删除
DROP INDEX indexId ON t_user_memory
唯一性索引
这种索引和前面的“普通索引”基本相同,但有一个区别:索引列的所有值都只能出现一次,即必须唯一。
1、创建
CREATE UNIQUE INDEX indexId ON t_user_memory(id);
2、删除和普通索引一样
主键索引
它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引,也就是我们的主键。
单列索引&组合索引
单列索引
依然使用上面的例子,当我们查找一个username = “Taoyongpan”的用户的时候,我们查处了10条,但是每条的密码不一样,我们查询的时候很快的查出 这十条数据,把这十条数据放到一个中间结果集上面,然后再对比密码一一排除,我们在密码上加索引也是同样的原理;
组合索引
当我们把username和password放到一个索引里面的时候就会直接查找到我们所需要的那一条数据,当数据量非常大的时候,会大大提高我们的查找速度,这就是组合索引;
1、创建
ALTER TABLE t_user_memory ADD INDEX indexUser (username,password)
2、删除操作同上
数据库索引的利与弊
利
1、建立索引的列可以保证行的唯一性,生成唯一的rowId
2、建立索引可以有效缩短数据的检索时间
3、建立索引可以加快表与表之间的连接
4、为用来排序或者是分组的字段添加索引可以加快分组和排序顺序
弊
1、创建索引和维护索引需要时间成本,这个成本随着数据量的增加而加大
2、创建索引和维护索引需要空间成本,每一条索引都要占据数据库的物理存储空间,数据量越大,占用空间也越大(数据表占据的是数据库的数据空间)
3、虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。
下篇预告
下一篇我们一起来学习一下,索引的原理是怎么的,为什么可以提高查询效率呢,等问题,我们下一篇再见。
相关推荐
MySQL Innodb 索引原理详解
mysql索引知识点详解
mysql索引数据结构详解
mysql 索引失效详解
包含mysql简介、索引介绍、索引引用策略、索引失效场景等
MySQL-数据库-索引详解
MySql创建索引的语法如下: CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [USING index_type] ON table_name (index_col_name,…) 其中对应的语法变量信息如下: [UNIQUE|FULLTEXT|SPATIAL]:中括号中的三个...
打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车拿汉语字典的目录页(索引)打比方,我们可以按拼音、笔画、偏旁部首等排序的目录(索引)快速查找到...
目录 1. 索引与执行计划 1 1.1. 索引入门 1 1.1.1. 索引是什么 1 1.1.2. 索引得分类 3 1.1.3. 基础语法 3 1.2. 执行计划 3 1.2.1. 什么是执行计划 3 1.2.2. 执行计划的作用 3 ...1.2.4. 执行计划详解 4
在关系数据库中,索引是一种单独对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的...在MySQL数据库一共支持5种类型的索引和9种索引失效的场景,下面,我来进行一一介绍。
Mysql的索引详解学习笔记
索引类似大学图书馆建书目索引,可以提高数据检索的效率,降低...Mysql索引主要有两种结构:B+Tree索引和Hash索引。我们平常所说的索引,如果没有特别指明,一般都是指B树结构组织的索引(B+Tree索引)。索引如图所示:
如果索引包含所有满足查询需要的数据的索引成为覆盖索引(Covering Index),也就是平时所说的不需要回表操作 判断标准 使用explain,可以通过输出的extra列来判断,对于一个索引覆盖查询,显示为using index,MySQL...
mysql 索引详解: 在mysql 中,索引可以分为两种类型 hash索引和 btree索引。 什么情况下可以用到B树索引? 1.全值匹配索引 比如: orderID=”123” 2.匹配最左前缀索引查询 比如:在userid 和 date字段上...
课程内容进行了精华的浓缩,有四大内容主旨,MySQL架构与执行流程,MySQL索引原理详解,MySQL事务原理与事务并发,MySQL性能优化总结与MySQL配置优化。课程安排的学习的教程与对应的学习课件,详细的学习笔以及课程...
mysql-数据库-索引详解.doc
之前在网上看到过很多关于mysql联合索引最左前缀匹配的文章,自以为就了解了其原理,最近面试时和面试官交流,发现遗漏了些东西,这里自己整理一下这方面的内容。 什么时候创建组合索引? 当我们的where查询存在多个...
mysql面试题,以及经典的索引问题详解