mysql官方对 索引的定义为: 索引(index)是帮助mysql高效获取数据的数据结构(这里是B+树)。
所以索引的本质:索引是数据结构
**
**
索引
索引原理
索引的分类
在一个表中,主键索引只能有一个,唯一索引可以有多个
-
主键索引(Primary key)
-
- 唯一的标识,主键不可重复,只能有一个列作为主键
-
唯一索引(unique key)
-
- 避免重复的列出现。(该列的每项内容必须唯一),但是多个列都可以是标识为唯一索引
-
-
- 这么理解这句话:这个列里的每个框里的内容在该列都是唯一的。 但是很多个列都可以达到这种状态。即很多列都可以是唯一索引。 这个唯一针对的是列的内容。而不是列本身。
-
-
常规索引(key/index)
- 默认的。 用index、key等关键字来设置
-
全文索引(FullText)
- 在特定的数据库引擎下才有,MyISAM一开始没有,现在好像也有了
- 快速定位数据
如果是唯一索引,那么字段唯一性越强,效率越高
索引的创建:3种办法
- 在创建表的时候给字段增加索引(如下面的 primary key主键索引,unique key唯一索引,key普通索引)
- 用 alter 创建索引
- 用 create 创建索引
drop table if exists `student`;
create table `student`(
`studentno` int(4) not null ,
`studentname` varchar(20) default null ,
`email` varchar (50) not null ,
`identitycard` varchar(18) default null ,
primary key (`studentno`),
unique key `identitycard`(`identitycard`),
key `email` (`email`)
)engine=myisam default charset=utf8;
alter table itheima.student add fulltext index studentname(studentname)
显示所有的索引信息
show index from 表名
索引优化测试:创建100万条之后,现在进行查询。看下结果
不建索引的时候,在100万条里查询数据
select * from app_user where name='用户9999'
分析此sql
explain select * from app_user where name='用户9999'
此时添加索引,再次查询
-- create index 索引名 on 表名(字段名)
create index index_app_user_name on app_user(`name`)
-- 索引名的命名规则: 索引名_表名_字段名
再次查询,0.01s
分析sql:直接就找到了
创建索引的原则
索引失效
一般这时候,就可以用union,不用 or。 union不会导致索引失效
用户管理、mysql备份
这里涉及到引用,面试不问。暂时只简单介绍
用户管理和mysql备份都可以直接通过navicat来操作。也都有相应的命令操作。
后记
sql编程:创建100万条数据(不必记忆)
CREATE TABLE `app_user` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT '',
`eamil` varchar(50) NOT NULL,
`phone` varchar(20) DEFAULT '',
`gender` tinyint(4) unsigned DEFAULT '0',
`password` varchar(100) NOT NULL DEFAULT '',
`age` tinyint(4) DEFAULT NULL,
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
-- 插入100万数据.
DELIMITER $$
-- 写函数之前必须要写,标志
CREATE FUNCTION mock_data ()
RETURNS INT
BEGIN
DECLARE num INT DEFAULT 1000000;
DECLARE i INT DEFAULT 0;
WHILE i<num DO
INSERT INTO `app_user`(`name`,`eamil`,`phone`,`gender`)VALUES(CONCAT('用户',i),'19224305@qq.com','123456789',FLOOR(RAND()*2));
SET i=i+1;
END WHILE;
RETURN i;
END;
SELECT mock_data() -- 执行此函数 生成一百万条数据
gender`)VALUES(CONCAT('用户',i),'19224305@qq.com','123456789',FLOOR(RAND()*2));
SET i=i+1;
END WHILE;
RETURN i;
END;
SELECT mock_data() -- 执行此函数 生成一百万条数据