MySQL高级(一)

时间:2026-10-27 14:58:54 来源:幸福记忆 作者:远方 阅读:51

索引

目的:提高数据的检索效率,也是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 视图名;