目的:提高数据的检索效率,也是sql优化中最直接的手段。
一、索引优点和缺点
优点 索引可以避免全表扫描,加快查询速度。多数查询可以仅扫描少量索引页及数据页,而不是遍历所有数据页。一些情况下,索引还可用于避免排序操作。 缺点
二、索引分类
1、普通索引
创建方法:
建表时创建
CREATE TABLE mytable (name VARCHAR(32) ,INDEX index_mytable_name (name));
说明:
mytable:表名
index_mytable_name:索引名称
name:字段名
建表后,直接创建索引
CREATE INDEX index_mytable_name ON mytable(name);
修改表结构
ALTER TABLE mytable ADD INDEX index_mytable_name (name);
注:如果是字符串字段,还可以指定索引的长度,在列命令后面加上索引长度就可以了(例如:name(11))
2、唯一索引
说明:索引列的值必须唯一,但允许有空值(null)。如果是组合索引,则列值的组合必须唯一
建表的时候一起创建
CREATE TABLE mytable (`name` VARCHAR(32) ,
UNIQUE index_unique_mytable_name (`name`));
建表后,直接创建索引
CREATE UNIQUE INDEX index_mytable_name ON mytable(name);
修改表结构
ALTER TABLE mytable ADD UNIQUE INDEX index_mytable_name (name);
3、主键索引
是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。一般是在建表的时候同时创建主键索引
索引创建:
建表的时候一起创建
CREATE TABLE mytable (`id` int(11) NOT NULL AUTO_INCREMENT ,
`name` VARCHAR(32) ,PRIMARY KEY (`id`));
修改表结构
ALTER TABLE test.t1 ADD CONSTRAINT t1_pk PRIMARY KEY (id);
4、复合索引(多列索引)
指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用组合索引时遵循最左前缀集合。(最左前列)
创建方法:
建表的时候一起创建
CREATE TABLE mytable (`id` int(11) ,`name` VARCHAR(32) ,
INDEX index_mytable_id_name (`id`,`name`));
建表后,直接创建索引
CREATE INDEX index_mytable_id_name ON mytable(id,name);
修改表结构
ALTER TABLE mytable ADD INDEX index_mytable_id_name (id,name);
5、全文索引(了解)
特点: 主要用来查找文本中的关键字,而不是直接与索引中的值相比较。 fulltext索引跟其它索引大不相同,它更像是一个搜索引擎,而不是简单的where语句的参数匹配。 fulltext索引配合match against操作使用,而不是一般的where语句加like。 它可以在create table,alter table ,create index使用,不过目前只有char、varchar,text 列上可以创建全文索引
创建方法:
建表的时候一起创建
CREATE TABLE `article` (`id` int(11) NOT NULL AUTO_INCREMENT ,
`title` char(250) NOT NULL ,`contents` text NULL ,
`create_at` int(10) NULL DEFAULT NULL ,PRIMARY KEY (`id`)
,FULLTEXT (contents));
建表后,直接创建索引
CREATE FULLTEXT INDEX index_article_contents ON article(contents);
修改表结构
ALTER TABLE article ADD FULLTEXT INDEX index_article_contents (contents);
索引删除&查询
查询
show index from table_name
删除
---01
DROP INDEX `index_name` ON `table_name`;
---02
ALTER TABLE `table_name` DROP INDEX 'index_name';
---03
ALTER TABLE `table_name` DROP PRIMARY KEY; --删除主键
6、外键约束
定义:
MySQL外键约束(FOREIGN KEY)用来在两个表的数据之间建立链接,它可以是一列或者多列。
一个表可以有一个或多个外键。外键对应的是参照完整性,一个表的外键可以为空值,若不为空值,则每一个外键的值必须等于另一个表中主键的某个值。
外键是表的一个字段,不是本表的主键,但对应另一个表的主键。定义外键后,不允许删除另一个表中具有关联关系的行。
外键添加:
创建表时添加外键约束
CONSTRAINT <外键名> FOREIGN KEY 字段名 [,字段名2,…]
REFERENCES <主表名> (主键列1 [,主键列2,…])
在修改数据表时添加外键约束
ALTER TABLE <数据表名> ADD CONSTRAINT <索引名>
FOREIGN KEY(<列名>) REFERENCES <主表名> (<列名>);
案例:
alter table student_info add constraint std_foregin
foreign key (`cid`) references classes(`cid`);
删除外键约束:
对于数据库中定义的外键,如果不再需要,可以将其删除。外键一旦删除,就会解除主表和从表间的关联关系,MySQL 中删除外键的语法格式如下:
ALTER TABLE <表名> DROP FOREIGN KEY <外键约束名>;
ALTER TABLE <表名> DROP INDEX <key名称>;
三、mysql的执行计划
Explain: 在mysql中执行查询语句前,可以增加Explain/desc关键字,查看mysql的执行计划。其中包括,查询的信息,索引,以及查询的类型。通过此类信息,可作为sql优化的参考。
使用方法:
#在select语句前加上Explain就可以了
例如: Explain SELECT * FROM user where name like ‘zhang%’;
参数说明:
select_type: 查询类型(简单查询,联合查询,子查询)
type:当前连接的类型: system>const(一次命中)>ref>range>index>all
说明:在对sql语句优化中,当前参数值应该至少达到range级别,最好能达到ref。
possible_keys: mysql推算可能会用到的索引
key: 最终用到的索引
rows: 检索行数
mysql开启执行计划监控:
查看是否开启: show variables like '%profiling%';
开启: set profiling=1; #开启后执行的sql语句都会被监控。
查看被执行的语句效率: show profiles;
查看具体的某个查询语句执行计划: show profile for query <query_id>;
视图view
定义: 视图就是一张虚拟表,它是由查询语句构建。视图中的数据来自于物理表。
下面是一些视图的常见应用: 1、重用SQL语句; 2、简化复杂的SQL操作。在编写查询后,可以方便的重用它而不必知道它的基本查询细节; 3、使用表的组成部分而不是整个表; 4、保护数据。可以给用户授予表的特定部分的访问权限而不是整个表的访问权限; 5、更改数据格式和表示。视图可返回与底层表的表示和格式不同的数据。 在视图创建之后,可以用与表基本相通的方式利用它们。
规则和限制
视图可以嵌套,可以利用从其他视图中检索数据的查询来构造一个视图;
ORDER BY 可以用在视图中,但如果从该视图检索数据的SELECT语句中也包含ORDER BY,则该视图中的ORDER BY将被覆盖
视图不能索引,也不能有关联的触发器;
视图可以和表一起使用。
创建视图:
CREATE VIEW view-name AS sql_statment;
修改视图:
#修改视图相当于覆盖
ALTER VIEW view-name AS sql_statment;
查看视图:
--视图可以当成普通表查看
show tables;
--查看视图的详细信息
show create view 视图名;
删除视图:
drop view 视图名;