索引
概念:
索引是由数据库表中一列或多列组合而成,其作用是提高对表中数据的查询速度。
类似于图书的目录,方便快速定位,寻找指定的内容。
索引通常分为5类,常用的是前三类:普通、全文、组合。
注意,索引也是有缺点的:
优点:提高查询数据的速度。
缺点:创建和维护索引的时间增多了,还占用硬盘空间。
创建:
在已存在的表上创建索引:
CREATE INDEX索引名
ON表名
(列段
);
.
通过 SQL 语句 ALTER TABLE 创建索引:
ALTER TABLE表名
ADD索引名
(列段
);
.
删除:
GROUP INDEX索引名
ON表名
;
普通索引
是最基本的索引,它没有任何限制;
当执行创建索引之前的查询代码,费时:0.089s
而执行了创建索引之后的查询代码,费时:0.031s
全文索引
提高查询较大字符串类型的速度;只有MyISAM引擎支持该索引,MySQL默认引擎不支持;
使用全文索引前:
结果:费时0.249s、57条记录。
使用全文索引后:
结果:费时0.049s、26条记录。
这里可能大家就有疑问了,“为什么相同的搜索关键词、相同的表,得到的结果却不同?”。
其实,费时不同很好理解,用了全文索引,数据的查询效率有所提升才是正确的;但条数不同是因为MySQL的全文索引索引规则不等同于OR关键字。即:MySQL全文索引 != OR
还有需要注意的是,MySQL的全文索引和现在流行的索引框架的索引规则也是不同的
,也就是查询到的结果还是会不同。
组合索引
概念:
普通(单列)索引:即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。
组合索引:即一个索引包含多个列。
组合索引遵循左侧原则,也是就是说一个查询可以只使用复合索引最左侧的一部份,
例如索引是key index (a,b,c). 可以支持a | a,b | a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效。
创建组合索引之前:
创建组合索引之后:
可能是数据量少的问题?有提升,提升感觉不是很明显。
主键索引
是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值;
唯一索引
与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一;
数据库备份
大家可能会说,在图形化界面直接右键复制、导出等操作不是更好用吗?
其实不然,因为你图形化界面程序的版本不同,有时候也是会导出失败的,而且花费的时间也远远超出命令行的方法。
导出整个数据库的结构:
mysqldump -h localhost -uroot -p123456 database > dump.sql
导出整个数据库的数据:
mysqldump -h localhost -uroot -p123456 db_xiaoli > d:/t_log_001.sql
导出单个数据表结构和数据:
例1、mysqldump -h localhost -uroot -p123456 database table > dump.sql
例2、mysqldump -h localhost -uroot -p123456 db_xiaoli t_log > d:/t_log_002.sql
例3、mysqldump -h localhost -uroot -p123456 db_xiaoli t_log > t_log_003.sql
例1是导出单个数据表结构,导出的文件存储在执行这条命令的地址下;
例2、3都是导出同一张表的数据,不同的是例2指定了导出文件存储的位置,而例3没有指定,那么例3导出的文件就保存在执行这条命令的地址下。
视图
概念:虚拟表,和普通表一样使用。
有助理解:
创建语法的关键字 | 是否实际占用物理空间 | 使用 | |
---|---|---|---|
视图 | create view | 只是保存了sql逻辑 | 增删改查,只是一般不能增删改 |
表 | create table | 保存了数据 | 增删改查 |
语法:
create view 视图名
as
查询语句;
使用:
select * from 视图名 where 筛选条件;
案例:
查询姓名中包含a字符的员工名、部门名和工种信息
这种就先创建视图:
CREATE VIEW myv1
AS
SELECT
last_name,
department_name,
job_title
FROM
employees e
JOIN departments d ON e.department_id = d.department_id
JOIN jobs j ON j.job_id = e.job_id;
然后就是使用:
SELECT * FROM myv1 WHERE last_name LIKE '%a%';
员工名、部门名和工种三个需要查询的,为什么在使用视图的最后只用员工名模糊查询a就行了,因为三表已经连接了,使用其中一个条件就等价了。