MySQL索引

索引


1. 什么是索引

创建在表上,是对数据库表中一列或多列的值进行排序的结构。
用于快速查询数据库表中的特定记录,可提高查询速度。

    不同的存储引擎定义了每个表的最大索引数和最大索引长度。所有存储引擎对每个表至少支持 
    16个索引,总索引长度至少256字节。 
2.分类

2.1 聚簇索引和非聚簇索引

  • 聚簇索引

    数据的物理存放顺序和索引顺序是一致的
    唯一性
    聚簇索引的叶结点就是数据结点
    主键默认设为聚簇索引;
    InnoDB引擎按照聚簇索引存储数据。

  • 非聚簇索引
    索引顺序与数据物理排列顺序无关
    一 个表对应的非聚簇索引可以有多条,根据不同列的约束可以建立不同要求的非聚簇索引;
    非聚簇索引的叶结点是索引结点,有一个指针指向对应的数据块;
    MyISAM使用的是非聚簇索引。

2.2 存储类型
索引有两种存储类型:B型(BTREE)树索引和哈希(HASH)索引。

InnoDB和MyISAM存储引擎支持BTREE索引。
  • HASH索引

特征如下:

    只用于使用=或<=>操作符的等式比较。
    优化器不能使用HASH索引来加速ORDER BY操作。
    MySQL不能确定在两个值之间大约有多少行。如果将一个MyISAM表改为HASH索引的MEMORY 
    表,会影响一些查询的执行效率。
    只能使用整个关键字来搜索一行。
  • BTREE索引

    当时>、<、>=、<=、BETWEEN 、!= 或者 <> , 或者 LIKE‘pattern' 操纵符时,都可以使
    用相关列上的索引。
    

下列范围查询适用于BTREE索引和HASH索引:

SELECT* FROM t1 WHERE key_col = 1 OR key_col IN (15,18,20);

下列范围查询适用于BTREE索引:

SELECT* FROM t1 WHERE key_col > 1 AND key_col < 10;

SELECT* FROM t1 WHERE key_col LIKE 'ab%' OR key_col BETWEEN 'lisa' 
                              AND simon';

3.优点和缺点

优点
- 提高检索速度;
- 对于有依赖关系的子表和父表之间的联合查询时,可提高查询速度;
- 使用分组和排序子句进行数据查询时,显著节省查询中分组和排序的时间。

缺点
- 创建和维护索引需要耗费时间,耗费时间的数量随着数据量的增加而增加;
- 索引需要占用物理空间;
- 增加、删除和修改数据时,要动态的维护索引,造成数据的维护速度降低了。


4. 索引分类

1)普通索引:不附加任何限制条件,可创建在任何数据类型中,其值是否唯一和非空由字段本 身的完整性约束条件决定。

2)唯一性索引:使用UNIQUE参数设置索引。索引的值是唯一的

3)全文索引:使用FULLTEXT参数设置索引。只能创建在CHAR、VARCHAR或TEXT类型字段上。查询数据量较大的字符串类型的字段时,使用全文索引可提高查询速度。

4)单列索引:在表中的单个字段上创建索引。只根据该字段进行索引(索引对应一个字段)。单列索引可以是普通索引或者唯一性索引或者全文索引。

5)多列索引:在表的多个字段上创建一个索引。可通过几个字段进行查询。
只有查询条件使用多列关键字最左边的前缀时,才可以使用索引,否则将不能使用索引。

6)空间索引:使用SPATIAL参数设置。
只能建立在空间数据类型上,可提高系统获取空间数据的效率。
只有MyISAM存储引擎支持空间检索,索引字段不为空


5. 索引的设计原则

1)选择唯一性索引。索引的列的基数越大,索引效果越好。

2)为经常需要排序、分组和联合操作的字段建立索引(避免排序操作,浪费时间)

3)为常作为查询条件的字段建立索引(提高查询速度)

4)限制索引的数目,不要过度索引(每个索引都需要占用磁盘空间,会降低写操作的性能。)

5)尽量使用短索引。如果对字符串进行索引,应该指定一个前缀长度。

6)尽量使用左前缀来索引(字段值很长,使用值的前缀索引)

7)删除不再使用或者很少使用的索引(减少索引对更新操作的影响)

8)对于InnoDB存储引擎的表,记录默认会按照一定的顺序保存。
InnoDB表的普通索引会保存主键的键值,主键应选择较短的数据类型,减少索引的磁盘占用,提高索引的缓存效果。

9)辅助索引,叶子结点存放着索引字段的值及对应的主键值

10)对查询where条件中区分度高的字段加索引;对查询分组和排序分组加索引。

11)一下情况无法使用到索引:like通配符在最左,not in, !=, <>, 队列做函数运算隐式数据类型转换,OR子句

12)FORCE INDEX强制加索引


6. 创建索引

创建表示可直接创建索引
这里写图片描述

1)创建普通索引

    创建一个表名为index1的表,在表中的id字段上建立索引。                      
CREATE TABLE index1(id  INT , name  VARCHAR(20),INDEX(id) );

2)创建唯一性索引

CREATE TABLE index2 (id  INT UNIQUE, name VARCHAR(20),   
                      UNIQUE INDEX index2_id(id  ASC)  );

3)创建全文索引(只有MyISAM存储引擎支持全文索引)

创建一个表名为index3的表,在表中的info字段上建立名为index3_info的全文索引。 
CREATE  TABLE index3 (id  INT, info  VARCHAR(20),        
                      FULLTEXT INDEX index3_info(info) )ENGINE=MyISAM; 

4)创建单列索引(单个字段)

创建一个表名为index4的表,表中的subject字段上建立名为index4_st的单列索引。 
CREATE  TABLE  index4(id  INT, subject VARCHAR(30),
                        INDEX index4_st(subject(10)) );

5)创建多列索引(多个字段,只有使用了第一个字段时才会触发索引

创建表名为index5的表,在表中的name和sex字段上建立名为index5_ns的多列索引。 
CREATE  TABLE  index5(id  INT,  name  VARCHAR(20), sex  CHAR(4), 
                        INDEX  index5_ns(name, sex)  );

6)创建空间索引

在index6表中的space字段上建立名为index6_sp的空间索引。            
    CREATE  TABLE  index6(id  INTspace GEOMETRY NOT NULL,
                           SPATIAL INDEX index6_sp(space) )ENGINE=MyISAM;

7. 在已存在的表上建立索引
CREATE UNIQUE INDEX index_id ON index(course_id);

1)创建普通索引

 CREATE INDEX index7_id ON  example0(id);   
 //id字段上建立索引

2)唯一性索引

 CREATE UNIQUE  INDEX index8_id  ON  index8(course_id); 
 //索引为index8_id

3)全文索引

CREATE  FULLTEXT INDEX index9_info  ON  index9(info);  

4)单列索引

  CREATE INDEX index10_addr  ON  index10(address(4));
  //查询address前4个字符

5)创建多列索引

CREATE INDEX index11_na  ON index11(name,address);  
//必须有name字段

6)空间索引

CREATE SPATIAL INDEX  index12_line  ON  index12(line);

8. 用ALTER TABLE 语句创建索引
ALTER TABLE 表名 ADD [UNIQUE | FULLTEXT |SPATIAL] INDEX
                    索引名(属性名 [(长度)] [ASC|DESC]);

1)创建普通索引

    在s1表中name字段上建立index_name的索引。如下:
ALTER TABLE s1 ADD INDEX index_name(name(20)); 

2)唯一性索引

在s2表中course_id字段上,建立index_id的唯一性索引。如下:
ALTER TABLE s2 ADD UNIQUE INDEX index_id(course_id);

3)全文索引

    在s3表中的info字段上建立名为index_info的全文索引。如下:
ALTER TABLE s3 ADD FULLTEXT INDEX index_info(info);  

4)单列索引

    在s4表中的address字段上建立名为index_addr的单列索引。
ALTER TABLE s4 ADD INDEX index_addr(address(4));

5)创建多列索引

    在s5表中的name和address字段上建立名为index_na索引
ALTER TABLE s5 ADD INDEX index_na(name,address);

6)空间索引

    在s6表中的line字段上建立名为index_line的多列索引。
ALTER TABLE s6 ADD SPATIAL INDEX index_line(line);

9. 删除索引
DROP INDEX 索引名 ON 表名;
  1. 查看索引使用情况
show status like 'Handler_read%';   

Handler_read_rnd_next的值较高意味着查询运行抵消。

11. 索引优化
  • 定期分析表和检查表
ANALYZE table tbl_name;     //表分析
CHECK table tbl_name;       //表检查
  • 定期优化表
OPTIMIZE table tbl_name;

参考资料:

《深入浅出MySQL》
《MySQL入门很简单》

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
MySQL索引是一种数据结构,可以帮助MySQL快速定位和访问表中的数据。使用索引可以提高查询效率,降低数据库的负载。下面是MySQL索引的一些基本概念和使用方法: 1. 索引类型 MySQL支持多种类型的索引,包括B树索引、哈希索引、全文索引等。其中,B树索引是最常用的一种,也是默认的索引类型。B树索引可以用于精确匹配和范围查询,而哈希索引主要用于等值查询,全文索引则用于文本检索。 2. 索引创建 可以在创建表时指定索引,例如: ``` CREATE TABLE users ( id INT PRIMARY KEY, name VARCHAR(50), email VARCHAR(50), INDEX idx_email (email) ); ``` 也可以在已有的表上添加索引,例如: ``` ALTER TABLE users ADD INDEX idx_name (name); ``` 3. 索引使用 查询语句中可以使用WHERE子句和ORDER BY子句来利用索引,例如: ``` SELECT * FROM users WHERE email = 'example@example.com'; SELECT * FROM users WHERE name LIKE 'John%' ORDER BY id DESC; ``` 需要注意的是,索引并不是越多越好,过多的索引会占用过多的磁盘空间并降低写操作的性能。因此,需要根据实际情况选择合适的索引。同时,还需要定期对索引进行维护,包括优化查询语句、删除不必要的索引等。 4. 索引优化 MySQL提供了一些工具来优化索引,例如EXPLAIN命令可以帮助分析查询语句的执行计划,找出慢查询和不必要的全表扫描。可以使用OPTIMIZE TABLE命令来优化表的索引和碎片,从而提高查询性能。还可以使用缓存来避免频繁的查询操作,例如使用Memcached或Redis等缓存工具。 以上就是MySQL索引的一些基本概念和使用方法,需要根据实际情况进行选择和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值