MySQL面试题 | 附答案解析(四)
7. 索引算法有哪些?
索引算法有 BTree算法和Hash算法BTree算法
BTree
是最常用的mysql数据库索引算法,也是mysql默认的算法。因为它不仅可以被用在=,>,>=,<,<=和between这些比较操作符上,而且还可以用于like操作符,只要它的查询条件是一个不以通配符开头的常量, 例如:
– 只要它的查询条件是一个不以通配符开头的常量
select * from user where name like ‘jack%’;–
如果一通配符开头,或者没有使用常量,则不会使用索引,例如:
select * from user where name like ‘%jack’;
Hash算法
Hash Hash索引只能用于对等比较,例如=,<=>(相当于=)操作符。由于是一次定位数据,不像BTree索引需要从根节点到枝节点,最后才能访问到页节点这样多次IO访问,所以检索效率远高于BTree索引。
8. 索引设计的原则
适合索引的列是出现在where子句中的列,或者连接子句中指定的列
基数较小的类,索引效果较差,没有必要在此列建立索引使用短索引
如果对长字符串列进行索引,应该指定一个前缀长度,这样能够节省大量索引空间
不要过度索引。索引需要额外的磁盘空间,并降低写操作的性能。在修改表内容的时候,索引会进行更新甚至重构,索引列越多,这个时间就会越长。所以只保持需要的索引有利于查询即可。
9. 创建索引的原则(重中之重)
索引虽好,但也不是无限制的使用,最好符合一下几个原则
1) 最左前缀匹配原则,组合索引非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。
2)较频繁作为查询条件的字段才去创建索引
3)更新频繁字段不适合创建索引
4)若是不能有效区分数据的列不适合做索引列(如性别,男女未知,最多也就三种,区分度实在太低)
5)尽量的扩展索引,不要新建索引。比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可。
6)定义有外键的数据列一定要建立索引。
7)对于那些查询中很少涉及的列,重复值比较多的列不要建立索引。
8)对于定义为text、image和bit的数据类型的列不要建立索引。
10. 创建索引的三种方式,删除索引
第一种方式:在执行CREATE TABLE时创建索引
第二种方式:使用ALTER TABLE命令去增加索引
ALTER TABLE table_name ADD INDEX index_name (column_list);1
ALTER TABLE用来创建普通索引、UNIQUE索引或PRIMARY KEY索引。
其中table_name是要增加索引的表名,column_list指出对哪些列进行索引,多列时各列之间用逗号分隔。
索引名index_name可自己命名,缺省时,MySQL将根据第一个索引列赋一个名称。另外,ALTER TABLE允许在单个语句中更改多个表,因此可以在同时创建多个索引。
第三种方式:使用CREATE INDEX命令创建
CREATE INDEX index_name ON table_name (column_list);
CREATE INDEX可对表增加普通索引或UNIQUE索引。(但是,不能创建PRIMARY KEY索引)
删除索引
根据索引名删除普通索引、唯一索引、全文索引:alter table 表名 drop KEY 索引名
alter table user_index drop KEY name;
alter table user_index drop KEY id_card;
alter table user_index drop KEY information;
删除主键索引:alter table 表名 drop primary key(因为主键只有一个)。这里值得注意的是,如果主键自增长,那么不能直接执行此操作(自增长依赖于主键索引):
需要取消自增长再行删除:
alter table user_index–
重新定义字段
MODIFY id int,
drop PRIMARY KEY
但通常不会删除主键,因为设计主键一定与业务逻辑无关。
最后,小编分类整理了许多java进阶学习材料和BAT面试给热爱IT行业的你,如果需要资料的请转发此文章后再私聊小编回复【java】就能领取2019年java进阶学习资料和BAT面试题以及《Effective Java》(第3版)电子版书籍。也可以加群:712263501领取海量学习资料进行学习。
MySQL面试题 | 附答案解析(四)相关推荐
- MySQL面试题 | 附答案解析(十四)
接上篇!!! 5. 什么是子查询 (1)QL语句的查询结果做为另一条查询语句的条件或查询结果 (2)SQL语句嵌套使用,内部的SQL查询语句称为子查询. 6. 子查询的三种情况 (1)询是单行单列的情 ...
- MySQL面试题 | 附答案解析(十六)
接上篇!!! 2. SQL的生命周期? (1)应用服务器与数据库服务器建立一个连接 (2)数据库进程拿到请求sql (3)解析并生成执行计划,执行 (4)读取数据到内存并进行逻辑处理 (5)通过步骤一 ...
- MySQL面试题 | 附答案解析(八)
事务 什么是数据库事务?事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态.事务是逻辑上的一组操作,要么都执行,要么都不执行 ...
- MySQL面试题 | 附答案解析(二十)
接上篇!!! 5. MySQL的复制原理以及流程 主从复制:将主数据库中的DDL和DML操作通过二进制日志(BINLOG)传输到从数据库上,然后将这些日志重新执行(重做):从而使得从数据库的数据与主数 ...
- MySQL面试题 | 附答案解析(十九)
数据库优化 1. 为什么要优化 (1)系统的吞吐量瓶颈往往出现在数据库的访问速度上 (2)随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢 (3)数据是存放在磁盘上的,读写速度无法和 ...
- MySQL面试题 | 附答案解析(十八)
接上篇!!! SQL语句优化的一些方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 n ...
- MySQL面试题 | 附答案解析(十七)
接上篇!!! 9. 主键使用自增ID还是UUID? 推荐使用自增ID,不要使用UUID. 因为在InnoDB存储引擎中,主键索引是作为聚簇索引存在的,也就是说,主键索引的B+树叶子节点上存储了主键索引 ...
- MySQL面试题 | 附答案解析(十五)
SQL优化 1. 如何定位及优化SQL语句的性能问题?创建的索引有没有被使用到?或者说怎么才可以知道这条语句运行很慢的原因? 对于低性能的SQL语句的定位,最重要也是最有效的方法就是使用执行计划,My ...
- MySQL面试题 | 附答案解析(十三)
常用SQL语句 1. SQL语句主要分为哪几类 数据定义语言DDL(Data Ddefinition Language)CREATE,DROP,ALTER 主要为以上操作 即对逻辑结构等有操作的,其中 ...
最新文章
- jstack 脚本 自动日志_用jstack自动化捕抓异常java代码脚本
- pytorch实战案例-手写数字分类-卷积模型——深度AI科普团队
- java excel 取值_java实现Excel 单元格取值工具类
- 3D数学之柏林噪声(Perlin Noise)
- 用java编写猜数字游戏
- python是一门胶水语言_python为什么叫胶水语言
- 图解HTTP读书笔记
- 环境化学试题及答案大全
- hdu5750Dertouzos
- 71、不同灭火器的适用范围
- java 浏览量_redis实现点击量/浏览量
- C#中包含英文月份的美式日期输出格式
- 网站点击弹窗微信二维码功能纯CSS
- web前端不好找工作之web前端面试简历补救篇
- [14] 胜利大逃亡
- Java 核心技术卷 II(第 8 版) – 读书笔记 – 第 1 章(下)
- Unity3d 制定游戏循环的策略
- python gui tkinter_Python GUI tkinter 学习笔记(一)
- 集合运算的C语言算法
- NO.47-------线性回归分析经典案例(汽车价格预测)
热门文章
- 虚拟纹理与几何图像技术
- SOLO: 按位置分割对象
- 如何写出安全的API接口(参数加密+超时处理+私钥验证+Https)
- Make sure no other Soong process is using it
- Duplicate class xxx
- 记一次阿里云RDS与自建数据库同步中断的补救过程
- 中国顶级黑客45秒使用声音来破坏您的计算机
- 2022-2028年中国游泳健身行业市场研究及前瞻分析报告
- 机器学习入门(06)— 输出层多元分类、softmax 归一化指数函数以及输出层的神经元数量
- UVa12096.The SetStack Computer