本篇博客讲的是MySQL的索引的功能和使用 , 以及存储引擎的基本简介
mysql
一. mysql索引算法
索引的简介和做用sql
索引在MySQL中叫作"键" , 是存储引擎用于快速找到记录的一种数据结构 . 索引对良好的性能很是关键 , 尤为是当表中的数据量愈来愈大时 , 索引对于性能的影响越来越发重要 .
shell
做用 : 经过必定的算法将数据库中的记录按必定的规律进行分组 , 这样查信息时能够缩小数据的搜索范围 , 从而提升溜了查询效率数据库
用生活实例来讲 , 索引就好像书的目录 , 清单上的列表 ; 比如人去吃火锅 , 当菜单拿到客户手上 , 客户能够根据菜单上的分类(海鲜 , 蔬菜类 , 肉类 , 饮料类等) , 根据本身的口味能第一时间找到本身想吃的菜 .安全
索引的分类bash
索引可分为 : 普通索引 , 惟一索引 , 全文索引 , 单列索引 , 多列索引 , 空间索引服务器
语法格式:数据结构
CREATE TABLE 表名 (
字段名1 数据类型 [完整性约束条件…],
字段名2 数据类型 [完整性约束条件…],
[UNIQUE | FULLTEXT | SPATIAL ] INDEX | KEY
[索引名] (字段名[(长度)] [ASC |DESC])
);并发
示例 :
建立一个INDEX普通索引
CREATE TABLE dept(
dept_id INT,
dept_name VARCHAR(30) ,
comment VARCHAR(50),
index (dept_name) # 将表中的dept_name字段指定为普通索引字段
);
建立一个UNIQUE惟一索引:
CREATE TABLE dept2 (
dept_id INT,
dept_name VARCHAR(30) ,
comment VARCHAR(50),
UNIQUE INDEX (dept_name)
);
相比普通索引来讲 , 比上面的索引选项多了一个unique选项
建立一个全文索引;
CREATE TABLE dept3 (
dept_id INT,
dept_name VARCHAR(30) ,
comment VARCHAR(50),
log text,
FULLTEXT INDEX (log)
)engine=myisam;
注: 只有MYISAM存储引擎支持全文索引,innodb存储引擎不支持全文索引
建立多列索引
CREATE TABLE dept13 (
dept_id INT,
dept_name VARCHAR(30) ,
comment VARCHAR(50),
INDEX (dept_name, comment)
);
相比普通索引来讲 , 就是将多个字段设置为索引
对已存在的表建立索引
语法一:
CREATE [UNIQUE | FULLTEXT | SPATIAL ] INDEX 索引名 ON 表名 (字段名[(长度)] [ASC |DESC]) ;
建立普通索引示例:此方法要指定索引名称
CREATE INDEX index_dept_name ON dept6 (dept_name);
建立惟一索引示例:
CREATE UNIQUE INDEX index_dept_name ON dept6 (dept_name);
建立全文索引示例:
CREATE FULLTEXT INDEX index_dept_name ON dept6 (dept_name);
建立多列索引示例:
CREATE INDEX index_dept_name_ comment ON dept6 (dept_name, comment);
语法二:
ALTER TABLE在已存在的表上建立索引:
ALTER TABLE 表名 ADD [UNIQUE | FULLTEXT | SPATIAL ] INDEX
索引名 (字段名[(长度)] [ASC |DESC]) ;
管理索引:
查看索引: show create table 表名\G
测试索引: explain select * from 表名 where 字段名='xx';
删除索引: drop index 索引名 on 表名
索引检测实例:
要求 : 建立一个school的数据库 , 建立一张t2表 , 用存储过程脚本t2表插入1000W条数据 , 而后查询t2数据看看花费了多长时间 ; 再为t2建立一个索引 , 再次查看数据看看所花费的时间
准备:
create database school #建立school数据库
create table school.t2(id int,name varchar(30)); #建立一张t2表 , 里面记录id号和名字
定义一个插入1000W条数据的存储过程 , 并调用此存储过程
mysql> delimiter $$ //设置命令的界定符(也称为结束符) mysql> create procedure autoinsert1() //建立autoinsert1这个存储过程(相似于shell脚本) -> BEGIN -> declare i int default 1; -> while(i<100000)do -> insert into school.t2 values(i,'ccc'); -> set i=i+1; -> end while; -> END$$ mysql> delimiter ; call atuoinsert1();
分两次查询数据 , 对比所花的时间(实验中途插入1000W条数据花了33分钟 , 插100W估计就能看出效果了):
从上述实验能够看到 , 在一个存放1000W的表中 , 查询一条数据跟建立索引后查询一条数据相差了4S的时间 , 随着数据更大 , 查询时间也会不断增大 , 因此足以证实 , 建立索引会大大提升MySQL的查询工做效率!!!
二. MySQL存储引擎介绍
了就是如何存储数据、如何为存储的数据创建索引和如何更新、查询数据等技术的实现方法。由于在关系数据库中数据的存储是以表的形式存储的,因此存储引擎也能够称为表类型(即存储和操做此表的类型)
在Oracle 和SQL Server等数据库中只有一种存储引擎,全部数据存储管理机制都是同样的。而MySql数据库提供了多种存储引擎。用户能够根据不一样的需求为数据表选择不一样的存储引擎,用户也能够根据本身的须要编写本身的存储引擎。
1. 查看存储引擎
SHOW ENGINES;
SHOW ENGINES\G 查看MYSQL支持的存储引擎
SHOW VARIABLES LIKE 'storage_engine%'; 查看当前的存储引擎
SHOW VARIABLES LIKE 'auto_inc%'; 查看自增加的设置状态
show global variables like '%connet%' 查看connet环境变量设置
mysql> show variables\G 查看全部的环境变量
show variables当前的会话
show global variables\G全局
2. 选择存储引擎
方法1.
mysql> create table innodb1(
-> id int
-> )engine=innodb;
mysql> show create table innodb1;
create tables test100(id init)engine=inodb;
方法2.
/etc/my.cnf
[mysqld] 在此行下添加下面的一行内容
default-storage-engine=INNODB
MySQL经常使用的存储引擎
MyISAM存储引擎
因为该存储引擎不支持事务、也不支持外键,因此访问速度较快。所以当对事务完整性没有要求并以访问为主的应用适合使用该存储引擎。
InnoDB存储引擎(MYSQL默认用此存储引擎)
因为该存储引擎在事务上具备优点,即支持具备提交、回滚及崩溃恢复能力等事务特性,因此比MyISAM存储引擎占用更多的磁盘空间。
所以当须要频繁的更新、删除操做,同时还对事务的完整性要求较高,须要实现并发控制,建议选择。
MEMORY
MEMORY存储引擎存储数据的位置是内存,所以访问速度最快,可是安全上没有保障。适合于须要快速的访问或临时表。
BLACKHOLE
黑洞存储引擎,能够应用于主备复制中的分发主库。使用BLACKHOLE存储引擎的表不存储任何数据,但若是mysql启用了二进制日志,SQL语句被写入日志(并被复制到从服务器)。这样使用BLACKHOLE存储引擎的mysqld能够做为主从复制中的中继重复器或在其上面添加过滤器机制。