网站首页 > 技术文章 正文
假如你去图书馆,借MySQL数据库方面的书籍,你要先找到计算机分类的房间,再找到数据库技术与应用的书柜,最后找到MySQL数据库等方面的书籍,其实这就是人工索引,即使你能从图书馆电脑软件里面搜索到你要的书籍,实际拿到手也得通过分类索引找到该书。
同样MySQL的索引的目的就是快速地找到你所需要的数据,首先你只要知道这件事就足够了。
索引的实现
可以采用简单的hash,二叉树,或者复杂的B树,B+树等方法来实现,MySQL是采用B+树索引数据结构,网上有大量的相关资料,我们在此不予赘述,我们只需了解MySQL是采用B+树来实现的就行了。
MySQL 索引分类
· 主键索引
在建表时会给表设置一个主键,MySQL 会默认给这个主键加上索引。
· 唯一索引
索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。
语句:
CREATE UNIQUE INDEX uq_name ON user(column);
或者ALTER TABLE table_name ADD UNIQUE uq_name ON (column);
问:能不能给costomer表创建唯一索引?
不可以,因为存在同名同姓的记录,但可以创建普通索引以提高查询速度。
· 普通索引
MySQL 基本的索引,没有什么限制。
语句:
CREATE INDEX ind_name ON customer(name);
或者ALTER TABLE customer ADD INDEX ind_name ON (name);
执行语句后创建了索引,试一下:
select * from customer where name='范玉莲';
有没有觉得快点?哈哈,不会有的,起码表中也得有上成千上万条数据才会有感觉吧。
· 组合索引
组合索引,顾名思义,给 MySQL 多个字段同时加上索引,在使用时要遵循最左匹配原则。
语句:
CREATE INDEX index_name ON user(column1,column2) -- 给 column1 和 column2 加上索引
· 全文索引
全文索引,主要用来查找文本中的关键字,不是直接与索引值相比较。与我们常见的搜索引擎(如elasticsearch、solr 等)功能相似。MySQL 全文索引性能一般,所以一般不用,作为了解即可。
创建适当的索引
索引是不是越多越好?不是的!由于索引要占据存储空间的,数据插入或更新时也需要更新索引,要耗费时间的,因此索引不是越多好。组合索引有必要的时候在用,有时宁肯创建两个索引来替代它。
索引优化
1、慢查询
慢查询日志是 MySQL 提供的日志记录,用来记录所有的慢 SQL 语句,我们可以通过设置慢查询的时间阈值 long_query_time,来定义什么样的 SQL 是慢 SQL。通过慢查询日志我们可以找出需要优化的 SQL,下一步就是进行 SQL 优化。
2、Explain 执行计划
通过上面的慢查询日志分析,我们可以知道有哪些慢 SQL 语句。但是这些 SQL 具体慢在哪里,需要如何优化,我们还需要更详细的分析计划,这里 MySQL 给我们提供了 Explain 关键字,通过该关键字我们可以分析出 SQL 语句的详细执行信息。
索引的优化目前只需了解一下,直到你进行项目开发时再去学习都可以的。
当你的customer表加入了潘长江,潘长河等,那么我们怎么一下子查询出以‘潘长’开头的所有客户?下节课我们介绍模糊查询,敬请期待。
猜你喜欢
- 2024-11-19 MySQL常用的SQL提示
- 2024-11-19 MySQL 8.0-索引- 不可见索引(invisible indexes)
- 2024-11-19 Web端 SQL审核平台——Yearning Mysql
- 2024-11-19 MySQL性能管理及架构设计:SQL查询优化、分库分表
- 2024-11-19 深入浅出MySQL索引及优化分析,写出更高性能的SQL语句
- 2024-11-19 Linux运维面试sql语句
- 2024-11-19 图解MySQL:如何正确使用索引?
- 2024-11-19 看这篇就够了!MySQL 索引知识点超全总结
- 2024-11-19 SQL审核平台——Yearning Mysql
- 2024-11-19 mysql中关于关联索引的问题
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)