陪你一起学mysql(四)——索引篇之初识

128 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情

前言

查询一个表耗时很长,看着loading在转圈圈,你的第一反应是什么?是不是去问DBA,这个表建索引了吗?基本上优化sql的第一步都是从索引入手,索引搞不定了,才会考虑其他方式。那索引到底是什么呢?它有什么优势和劣势呢?

索引是什么

官方文档介绍,索引是帮助mysql高效获取数据的一种数据结构,更通俗的说,索引就好比一本书前面的目录,能加快数据库的查询速度。一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往是存储在磁盘上的文件上。我们通常说的索引,包括聚集索引,唯一索引,没有特别说明的,默认都是使用B+树结构组织。

索引的优势和劣势

优势

  • 可以提高数据库的检索效率,降低数据库的的IO成本,类似于书的目录
  • 通过索引列对数据进行排序,降低了数据排序的成本,降低了CPU的消耗(原因:被索引的列会自带进行排序,所以对于order by语句来说,效率会提高很多)

劣势

  • 索引会占用磁盘空间
  • 索引虽然可以提高查询效率,但是会降低更新表的效率。比如每次对表进行增删改操作,mysql不仅要保存数据,还需要保存和更新所对应的索引文件

索引的使用

索引的类型

  • 主键索引:索引列中的值必须是唯一的,不允许有空值。
ALTER TABLE table_name ADD PRIMARY KEY (column_name);
  • 普通索引:MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值。
ALTER TABLE table_name ADD INDEX index_name (column_name);
  • 唯一索引:索引列中的值必须是唯一的,但是允许为空值。
CREATE UNIQUE INDEX index_name ON table(column_name);
  • 全文索引:只能在文本类型CHAR,VARCHAR,TEXT类型字段上创建全文索引。字段长度比较大时, 如果创建普通索引,在进行like模糊查询时效率比较低,这时可以创建全文索引。
-- 创建表时,创建全文索引 
CREATE TABLE `t_fulltext` ( 
`id` int(11) NOT NULL AUTO_INCREMENT, 
`content` varchar(100) DEFAULT NULL, 
PRIMARY KEY (`id`), 
FULLTEXT KEY `idx_content` (`content`) ) 
ENGINE=InnoDB DEFAULT CHARSET=utf8; 
-- 创建全文索引 
ALTER TABLE `t_fulltext` ADD FULLTEXT INDEX `idx_content`(`content`);
-- 可以使用MATCH() ... AGAINST语法执行全文搜索。
SELECT * FROM t_fulltext WHERE MATCH(content) AGAINST('温故知新之java');
  • 空间索引:MySQL在5.7之后的版本支持了空间索引,而且支持OpenGIS几何数据模型。MySQL 在空间索引这方面遵循OpenGIS几何数据模型规则
  • 前缀索引:在文本类型如CHAR,VARCHAR,TEXT类列上创建索引时,可以指定索引列的长度,但是数值类型不 能指定。
ALTER TABLE table_name ADD INDEX index_name (column1(length));
  • 补充:按照索引列的数量可以将索引分为单列索引和组合索引,一般情况下,建议使用组合索引代替单列索引(主键索引除外),组合索引的使用,需要遵循最左匹配原则。
ALTER TABLE table_name ADD INDEX index_name (column1,column2);

索引的查看

SHOW INDEX FROM city;

image.png

索引的删除

DROP INDEX index_name ON table

结束

此次分享的mysql就这么多了,需要交流学习可以关注公众号【温故知新之java】,互相学习,一起进步!