索引-分类
索引-分类
分类 | 含义 | 特点 | 关键字 |
---|---|---|---|
主键索引 | 针对表中主键创建的索引 | 默认自动创建,只能有一个 | PRIMARY |
唯一索引 | 避免同一个表中某数据列中的值重复 | 可以有多个 | unique |
常规索引 | 快速定位特定数据 | 可以有多个 | |
全文索引 | 全文索引查找的是文本中的关键词,而不是比较索引中的值 | 可以有多个 | fulltext |
在innoDB存储引擎中,根据索引存储形式,又可以分为以下两种:
分类 | 含义 | 特点 |
---|---|---|
聚集索引 | 将数据存储与索引放到了一块,索引结构的叶子节点保存了行数据 | 必须有,而且只有一个 |
二级索引 | 将数据与索引分开存储,索引结构的叶子节点关联的是对应的主键 | 可以存在多个 |
聚集索引选取规则
如果存在主键,主键索引就是聚集索引。
如果不存在主键,将使用第一个唯一(unique)索引作为聚集索引。
如果表没有主键,或没有合适的唯一索引,则innoDB会自动生产一个rowid作为隐藏的聚集索引。
1.一下SQL语句,那个执行效率高?为什么?
select *from user where id =10;
select * from user where name =‘arm’
备注:id为主键,name字段创建的有索引;
innoDBZ主键索引的B+tree高度为多高呢?
假设:
一行数据大小为1k,一页中可以存储16行这样的数据。innoDB的指针占用6个字节的空间,主键即使为bigint,占用字节数为8。
高度为2:
n*8+(n+1)6=161024,算出n约为1170
1170*16=18736
高度为3:
1171 *1171 * 16=21939856
索引-语法
创建索引
create [unique|fulltext] index index_name on table_name (index_col_name,...)
查看索引
show index from table_name;
删除索引
drop index index_name on table_name;
**案例 **
数据准备
CREATE TABLE tb_user (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL,phone VARCHAR(20),email VARCHAR(100),profession VARCHAR(100),age INT,gender TINYINT,status TINYINT,create_time DATETIME
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;insert into itcast.tb_user (id, name, phone, email, profession, age, gender, status, create_time)
values (1, '吕布', '17799990001', 'lyubu666@163.com', '软件工程', 23, 1, 6, '2001-09-02 00:00:00'),(2, '曹操', '17799990002', 'caocao666@qq.com', '通讯工程', 33, 1, 0, '2001-03-05 00:00:00'),(3, '赵云', '17799990003', '1779999@qq.com', '英语', 34, 2, 0, '2002-03-02 00:00:00'),(4, '孙悟空', '17799990004', '1779999004@qq.com', '工程造价', 54, 1, 0, '2001-09-22 00:00:00'),(5, '花木兰', '17799990005', '1779999005@sina.com', '软件工程', 23, 1, 1, '2001-04-07 00:00:00'),(6, '大乔', '17799990006', 'dagiao66@sina.com', '舞蹈', 23, 2, 0, '2001-08-08 00:00:00'),(7, '貂蝉', '17799990007', 'luna_love@sina.com', '应用数学', 22, 2, 0, '2001-06-23 00:00:00'),(8, '程咬金', '17799990008', 'chengyaojin@163.com', '化工', 24, 1, 0, '2001-04-18 00:00:00'),(9, '项羽', '17799990009', 'xiaoyu66@qq.com', '金属材料', 38, 1, 0, '2001-04-16 00:00:00'),(10, '白起', '17799990010', 'baiqi666@qq.com', '机械工程及其自动化', 43, 1, 0, '2001-01-11 00:00:00'),(11, '韩信', '17799990011', 'hanxin56.com', '无机非金属材料工程', 27, 1, 2, '2001-03-09 00:00:00'),(12, '荆轲', '17799990012', 'jingke1234@163.com', '会计', 27, 1, 0, '2001-02-10 00:00:00'),(13, '兰陵王', '17799990013', 'lanlingwang@126.com', '工程造价', 29, 1, 3, '2001-01-12 00:00:00'),(14, '狂铁', '17799990014', 'kuangtiex@sina.com', '应用数学', 44, 1, 2, '2001-02-12 00:00:00'),(15, '貂蝉', '17799990015', '0495984374@qq.com', '软件工程', 43, 2, 0, '2001-04-30 00:00:00'),(16, '狄仁杰', '17799990016', '8859@qq.com', '软件工程', 40, 1, 0, '2001-02-03 00:00:00'),(17, '半月', '17799990017', 'xiaomi2001@sina.com', '工业经济', 31, 1, 1, '2001-03-08 00:00:00'),(18, '小乔', '17799990018', '894334342@qq.com', '化工', 35, 2, 0, '2007-03-06 00:00:00'),(19, '狄仁杰', '17799990019', 'judymail@166.com', '国际贸易', 38, 0, 0, '2001-01-02 00:00:00'),(20, '安琪拉', '17799990020', 'jddomlhl@163.com', '城市规划', 30, 2, 0, '2001-04-12 00:00:00'),(21, '典韦', '17799990021', 'ycaunanjian@163.com', '城市规划', 51, 1, 2, '2001-02-12 00:00:00'),(22, '廉颇', '17799990022', 'altcy3200@139.com', '土木工程', 52, 1, 0, '2002-03-10 00:00:00'),(23, '后羿', '17799990023', 'altycj2000@139.com', '城市园林', 20, 1, 0, '2002-03-10 00:00:00'),(24, '姜子牙', '17799990024', '37483484@qq.com', '工程造价', 29, 1, 4, '2003-05-26 00:00:00');
按照下列的需求,完成索引创建
1.name字段为姓名字段,该字段的值可能会重复,为该字段创建索引。
create index idx_user_name on tb_user(name);
2.phone手机号字段的值,是非空,且唯一的,为该字段创建唯一索引。
create unique index idx_user_phone on tb_user(phone);
3.为profession,age,status创建联合索引。
create index idx_user_pro_age_sta on tb_user(profession,age,status);
4.为email建立合适的索引来提升查询效率。
create index idx_user_email on tb_user(email);
数据库学习记录(看看多久可以掌握)
学习的课程是b站黑马程序员的免费课程,主要是记录一下代码和流程,没有很详细,下面是课程地址黑马程序员 MySQL数据库入门到精通,从mysql安装到mysql高级、mysql优化全囊括_哔哩哔哩_bilibili
如果大家发现下面代码有错误的,请留言告诉我,我会及时修改的