java——mysql随笔——索引

 索引简介:

 索引结构:    根据存储引擎的不同,索引结构也就不同(各个存储引擎支持的索引不一样)

B-Tree(多路平衡查找树)
参考王道考研B+Tree:https://www.bilibili.com/video/BV1b7411N798?t=5.3&p=74

BTree可视化工具:https://www.cs.usfca.edu/~galles/visualization/BTree.html

B+Tree与BTree的区别

1、B+Tree的所有数据都会在叶子节点出现。

2、B+Tree的叶子节点形成了一个单向链表。

 索引的分类:

 查询过程:当查询条件是二级索引所在的列,二级索引的叶子节点仅存放对应数据的主键。查询首先从该二级索引上查找出该数据的主键,再使用该主键去聚集索引中查找该主键对应的数据,这个查询过程叫做回表查询

4、索引语法

创建索引
CREATE [UNIQUE|FULLTEXT] INDEX index_name ON table_name (index_col,name,...);

unique:表示唯一索引;

fulltext:表示全文索引;

如果这2个参数都不加,表示创建的是一个常规索引。

一个索引可以关联多个字段:单个字段表示单列索引,多个字段表示联合索引或者关联索引;


查看索引
SHOW INDEX FROM table_name;


删除索引
DROP INDEX index_name ON table_name;

 查询当前表有哪些索引:

 INNODB 引擎创建索引,默认用的是B+tree

删除索引:

 SQL性能分析:

 通过慢查询日志可以知道哪些SQL语句效率比较低:

 profile详情:

 explain执行计划:

explain执行计划


在SELECT语句前加上EXPLAIN关键字即可查看执行计划。EXPLAIN执行计划个字段含义:

Id:select查询的序列号,表示查询中执行select子句或者是操作表的顺序(id相同,执行顺序从上到下;id不同,值越大,越先执行)(多表查询时)

select_type:表示SELECT的类型,常见的取值有SIMPLE(简单表,即不使用表连接或者子查询)、PRIMARY(主查询,即外层的查询)、UNION(UNION中的第二个或者后面的查询语句)、

SUBQUERY(SELECT/WHERE之后包含了子查询)等

type:表示连接类型,性能由好到差的连接类型为NULL、system、const、eq_ref、ref、range、index、all(使用主键索引或者唯一索引type为const,使用非唯一索引type为ref,all代表全表扫描)

possible_key:显示可能应用在这张表上的索引,一个或多个

Key:实际使用的索引,如果为NULL,则没有使用索引

Key_len:表示索引中使用的字节数,该值为索引字段最大可能长度,并非实际使用长度,在不损失精确性的前提下,长度越短越好。

rows:MySQL认为必须要执行查询的行数,在innodb引擎的表中,是一个估计值,可能并不总是准确的。

filtered:表示返回结果的行数占需要读取行数的百分比,filtered的值越大越好

 索引使用——验证索引效率:

 索引使用——最左前缀法则:

最左前缀法则

如果索引了多列(联合索引),要遵守最左前缀法则。最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列。如果跳跃某一列,索引将部分失效(后面的字段索引失效)。

 索引使用——范围查询:

pro:47 

age:49  

sta:54

范围查询

联合索引中,出现范围查询(>,<)范围查询右侧的列索引失效。因此,查询的时候,尽量使用>=和<=来代替。

 索引使用——索引使用失效情况——索引列运算

引列运算

不要再索引列上进行运算操作,索引将失效。

例如:EXPLAIN SELECT * FROM tb_user where substring(phont,10,2) = ‘15’;

 索引使用——索引使用失效情况——索引列运算

pro:47 

age:49  

sta:54

字符串不加引号

字符串类型字段使用时,不加引号,索引将失效。

索引使用——索引使用失效情况——模糊查询

模糊查询

如果仅仅是尾部模糊匹配,索引不会失效,如果是头部模糊匹配,索引将失效

索引使用——索引使用失效情况——or连接的条件

or连接的条件

用or分割开的条件,如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到。只有两侧都有索引,索引才会被用到。

索引使用——索引使用失效情况——数据分布影响

数据分布影响

如果MySQL评估使用索引比全表更慢,则不使用索引。

索引使用——SQL提示

索引使用——覆盖索引&回表查询

索引使用——前缀索引

 email选择性最好

 索引使用——单列索引与联合索引

单列索引与联合索引

单列索引:即一个索引只包含单个列

联合索引:即一个索引包含了多个列

在业务场景中,如果存在多个查询条件,考虑针对于查询字段建立索引时,建议建立联合索引,而非单列索引。

索引设计原则:

索引设计原则:


1、针对于数据量较大,且查询比较频繁的表建立索引。

2、针对于常作为查询条件(where)、排序(order by)、分组(group by)操作的字段建立索引。

3、尽量选择区分度高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率越高。

4、如果是字符串类型的字段,字段的长度较长,可以针对于字段的特点,建立前缀索引。

5、尽量使用联合索引,减少单列索引,查询时,联合索引很多时候可以覆盖索引,节省存储空间,避免回表,提高查询效率。

6、要控制索引的数量,索引并不是多多益善,索引越多,维护索引结构的代价也就越大,会影响增删改的效率。

7、如果索引列不能存储NULL值,请在创建表时使用NOT NULL约束它。当优化器知道每列是否包含NULL值时,它可以更好地确定哪个索引最有效地用于查询。

索引总结:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java-MySQL城市管理软件是一款基于Java语言和MySQL数据库的应用程序,旨在提供城市管理机构高效管理城市资源的解决方案。该软件集成了多种功能模块,包括人口管理、行政区划管理、公共设施管理等,帮助城市管理机构更好地规划、运营和管理城市。 首先,人口管理模块。该模块通过与MySQL数据库建立连接,实现对人口数据的录入、查询、统计等功能。可以方便地管理居民的基本信息,包括身份证号、姓名、性别、年龄等,并能够根据需求进行数据分析和统计,如按年龄段统计人口数量。 其次,行政区划管理模块。该模块利用MySQL数据库存储城市的行政区划数据,包括省、市、区县等信息。用户可以通过该模块快速获取特定区域的行政信息,并能够进行行政区划的查询、增加、修改等操作,使城市管理机构能够高效管理城市的行政区划变更。 再次,公共设施管理模块。该模块通过与MySQL数据库的交互,实现对公共设施的管理,如道路、桥梁、公园、医院等。用户可以通过该模块对公共设施进行添加、删除、修改等操作,以便更好地维护和管理城市的公共设施。 此外,该软件还具备用户管理、报表生成、数据备份等功能。用户管理模块允许城市管理机构管理员添加、删除和修改用户权限,确保数据的安全性。报表生成功能能够根据用户需求生成各类统计报表,如人口分布图、公共设施使用情况等。数据备份功能则利用MySQL的高可靠性和稳定性,定期对数据进行备份,以确保数据的可靠性和安全性。 总之,Java-MySQL城市管理软件通过利用Java编程语言和MySQL数据库的优势,提供了一种高效、可靠的城市管理解决方案。它可以帮助城市管理机构实现对人口、行政区划和公共设施等数据的管理和统计分析,为城市规划和运营提供有力支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值