首页 > 数据库 >MySQL索引

MySQL索引

时间:2024-03-13 16:14:17浏览次数:33  
标签:age 查询 索引 user MySQL where select

索引是帮助MySQL高效获取数据的数据结构

一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往是存储在磁盘上的文件中的(可能 存储在单独的索引文件中,也可能和数据一起存储在数据文件中)。

通常所说的索引,包括聚簇索引、覆盖索引、组合索引、前缀索引、唯一索引等,没有特别说明, 默认都是使用B+树结构组织的索引。

优势和劣势
优势:
可以提高数据检索的效率,降低数据库的IO成本,类似于书的目录。
通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗。
被索引的列会自动进行排序,包括【单列索引】和【组合索引】,只是组合索引的排序要复杂 一些。
如果按照索引列的顺序进行排序,对应order by语句来说,效率就会提高很多。
劣势:
索引会占据磁盘空间
索引虽然会提高查询效率,但是会降低更新表的效率。比如每次对表进行增删改操作,MySQL不仅 要保存数据,还要维护索引文件。

    1. 索引的类型
      按照索引列的数量分类:
      单列索引:索引中只有一个列。
      组合索引:使用2个以上的字段创建的索引。
      1. 单列索引
        主键索引:索引列中的值必须是唯一的不允许有空值。
        普通索引:MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值。
        唯一索引:索引列中的值必须是唯一的,但是允许为空值。
        全文索引:只能在文本类型CHAR,VARCHAR,TEXT类型字段上创建全文索引。字段长度比较大时,如果创建普通索引,在进行like模糊查询时效率比较低,这时可以创建全文索引。MyISAM和InnoDB中都可以使用全文索引。
        InnoDB全文索引,官网介绍:https://dev.mysql.com/doc/refman/5.7/en/innodb-fulltext-inde x.html
        全文搜索时候,全文索引一般很少使用,数据量比较少或者并发度低的时候可以用。但是数据 量大或者并发度高的时候一般是用专业的工具Lucene,ES,Solr
        可以使用MATCH() ... AGAINST语法执行全文搜索。
        空间索引:MySQL在5.7之后的版本支持了空间索引,而且支持OpenGIS几何数据模型。MySQL在 空间索引这方面遵循OpenGIS几何数据模型规则。(本课程中不做过多介绍)
        参考资料:MySQL中 OpenGIS Geometry Model
        空间数据类型
        前缀索引:在文本类型如CHAR,VARCHAR,TEXT类列上创建索引时,可以指定索引列的长度, 但是数值类型不能指定。
      2. 组合索引
        组合索引的使用,需要遵循最左前缀原则(最左匹配原则,后面详细讲解)。
        一般情况下,建议使用组合索引代替单列索引(主键索引除外,具体原因后面讲解)。

 

建索引的几大原则

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.=和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式。

3.尽量选择区分度高的列作为索引,区分度的公式是count(distinct col)/count(*),表示字段不重复的比例,比例越大我们扫描的记录数越少,唯一键的区分度是1,而一些状态、性别字段可能在大数据面前区分度就是0,那可能有人会问,这个比例有什么经验值吗?使用场景不同,这个值也很难确定,一般需要join的字段我们都要求是0.1以上,即平均1条扫描10条记录。

4.索引列不能参与计算,保持列“干净”,比如from_unixtime(create_time) = ’2014-05-29’就不能使用到索引,原因很简单,b+树中存的都是数据表中的字段值,但进行检索时,需要把所有元素都应用函数才能比较,显然成本太大。所以语句应该写成create_time = unix_timestamp(’2014-05-29’)。

5.尽量的扩展索引,不要新建索引。比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可。

 

select count(*) from task where status=2 and operator_id=20839 and operate_time>1371169729 and operate_time<1371174603 and type=2;

根据最左匹配原则,最开始的sql语句的索引应该是status、operator_id、type、operate_time的联合索引;其中status、operator_id、type的顺序可以颠倒.

 

满足复合索引的查询的两大原则:
假如创建的复合索引为三个字段,按顺序分别是(name,age,sex)
在查询时能利用复合索引的查询条件如下:

1、最左前缀原则(如下四种都满足条件)

select * from user where name = ?
select * from user where name = ? and age = ?
select * from user where name = ? and sex = ?
select * from user where name = ? and age = ? and sex = ?
2、如下是不满足最前左缀的条件(但是不是全部都不生效,如下第2原则解释)

select * from user where name = ? and sex = ? and age = ?
select * from user where age = ? and sex = ? and name = ?
select * from user where sex = ? and age = ? and name = ?
select * from user where age = ? and sex = ?
…………等等
3、MySQL 引擎在执行查询时,为了更好地利用索引,在查询过程中会动态调整查询字段的顺序!(也就是说,当条件中的字段全部达到复合索引中的字段时,可以动态调整字段顺序,使其满足最前左缀)

#可以使用复合索引:索引中包含的字段数都有,只是顺序不正确,在执行的时候可以动态调整为最前左缀
select * from user where sex = ? and age = ? and name = ?
select * from user where age = ? and sex = ? and name = ?

#不可以使用复合索引:因为缺少字段,并且顺序不正确
select * from user where sex = ? and age = ?
select * from user where age = ? and name = ?
select * from user where age = ?
select * from user where sex = ?

 

 

查询优化神器 - explain命令

关于explain命令相信大家并不陌生,具体用法和字段含义可以参考官网explain-output,这里需要强调rows是核心指标,绝大部分rows小的语句执行一定很快(有例外,下面会讲到)。所以优化语句基本上都是在优化rows。

慢查询优化基本步骤

0.先运行看看是否真的很慢,注意设置SQL_NO_CACHE

1.where条件单表查,锁定最小返回记录表。这句话的意思是把查询语句的where都应用到表中返回的记录数最小的表开始查起,单表每个字段分别查询,看哪个字段的区分度最高

2.explain查看执行计划,是否与1预期一致(从锁定记录较少的表开始查询)

3.order by limit 形式的sql语句让排序的表优先查

4.了解业务方使用场景

5.加索引时参照建索引的几大原则

6.观察结果,不符合预期继续从0分析

 

 

1、创建索引
对于查询占主要的应用来说,索引显得尤为重要。很多时候性能问题很简单的就是因为我们忘了添加索引而造成的,或者说没有添加更为有效的索引导致。如果不加索引的话,那么查找任何哪怕只是一条特定的数据都会进行一次全表扫描,如果一张表的数据量很大而符合条件的结果又很少,那么不加索引会引起致命的性能下降。但是也不是什么情况都非得建索引不可,比如性别可能就只有两个值,建索引不仅没什么优势,还会影响到更新速度,这被称为过度索引。
2、复合索引
比如有一条语句是这样的:select * from users where area='beijing' and age=22;
如果我们是在area和age上分别创建单个索引的话,由于mysql查询每次只能使用一个索引,所以虽然这样已经相对不做索引时全表扫描提高了很多效率,但是如果在area、age两列上创建复合索引的话将带来更高的效率。如果我们创建了(area, age, salary)的复合索引,那么其实相当于创建了(area,age,salary)、(area,age)、(area)三个索引,这被称为最佳左前缀特性。因此我们在创建复合索引时应该将最常用作限制条件的列放在最左边,依次递减。
3、索引不会包含有NULL值的列
只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。
4、使用短索引
对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个CHAR(255)的 列,如果在前10 个或20 个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。
5、排序的索引问题
mysql查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。
6、like语句操作
一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。
7、不要在列上进行运算
select * from users where YEAR(adddate)<2007;
将在每个行上进行运算,这将导致索引失效而进行全表扫描,因此我们可以改成
select * from users where adddate<‘2007-01-01';
8、不使用NOT IN和<>操作
NOT IN和<>操作都不会使用索引将进行全表扫描。NOT IN可以NOT EXISTS代替,id<>3则可使用id>3 or id<3来代替。

标签:age,查询,索引,user,MySQL,where,select
From: https://www.cnblogs.com/sxy-blog/p/18065429

相关文章

  • MYSQL- 使用SQL99 实现7种JOIN 操作
    DESCemployees; DESCdepartments;   ##中图就是内连接SELECTlast_name,department_nameFROMemployeeseJOINdepartmentsdONe.department_id=d.department_id##sql99内连接SELECTlast_name,department_name,cityFROMemployeeseINNERJOIN......
  • MYSQL 主从不一致的原因分析
    数据库作为存储数据的组件,数据的一致性一定是要保证的前提,今天给出两个场景来分析数据不一致的原因。binlog同步模式导致主从不一致在MYSQL中主库向从库同步数据是利用binlog记录修改操作,然后将binlog传递给从库进行复制,binlog的格式有3种,row在对update,delete,insert语句进行......
  • MySQL遇到的一些坑
    坑第一大坑后端代码没问题,前端拉取代码的时候拉取的是master分支,而master分支还没有跟新到最新进度,导致某些菜单访问正常但是有几个菜单模块访问不了,浏览器进度条卡住后端也要改,可以重新拉取或者merge,后端和前端要对应上gitpullhttp://117.73.11.3:8090/WindPowerPrediction......
  • mysql如何保证数据一致性
    MySQL保证数据一致性的主要方式有以下几种:事务支持:MySQL支持事务,通过事务可以保证数据库操作要么全部执行成功,要么全部失败回滚,从而确保数据的一致性。ACID特性:MySQL遵循ACID(原子性、一致性、隔离性、持久性)特性,其中一致性是指事务执行前后数据的状态保持一致。在事......
  • 基于Java+Vue+Mysql的门店管理系统(附配套文档和源码)【毕业设计分享】
          前言:门店管理系统是一个综合性的软件解决方案,旨在帮助门店高效地管理日常运营、提升服务质量、优化资源配置和增强决策能力。以下是您提到的各个管理模块的简要概述:门店管理:门店信息管理:记录门店的基本信息,如门店名称、地址、联系方式、营业时间等。门店布局管......
  • 基于Java+Vue+Mysql的WMS仓库管理系统(附配套文档和源码)【毕业设计分享】
          前言: WMS(WarehouseManagementSystem)仓库管理系统是一个用于优化仓库操作、提高效率和准确性的软件解决方案。以下是针对列出的WMS仓库管理系统的各个部分的简要描述:1.订单管理订单管理是WMS的核心功能之一,涉及处理、跟踪和完成客户订单。这包括:订单录入:......
  • 什么是索引下推?
    什么是索引下推索引下推(IndexConditionPushdown,简称ICP),是MySQL5.6版本的新特性,用于优化数据查询。不使用索引条件下推优化时存储引擎通过索引检索到数据,然后返回给MySQL服务器,服务器然后判断数据是否符合条件。当使用索引条件下推优化时,如果存在某些被索引的列的判断条件时,M......
  • mysql卸载安装及其报错解决
    数据库软件机制复杂,解决它的相关问题的时候最有效的方法是dos命令。在删除,修改密码和处理报错的时候,往往只要dos命令正确发挥作用,不会引发别的问题而若是直接对mysql下的各种文件进行修改极易引发未知问题,应谨慎。为不使安装过程产生报错应该先在以下几个方面进行清理。1......
  • MySQL3种指定索引的方式
    在使用MySQL进行查询时,我们经常会遇到SQL执行没有按照我们预想的那样去使用某个索引优化查询,那怎么解决这个问题呢?对于这个问题,MySQL给我们准备了三个方法,这三个方法可以帮助我们让SQL执行按照我们预想的那样去选择索引。今天我们就针对这三个方法分别来说说吧!useindex:在你查......
  • mysql索引详解
    一、介绍索引是通过某种算法,构建出一个数据模型,用于快速找出在某个列中有一特定值的行,不使用索引,MySQL必须从第一条记录开始读完整个表,直到找出相关的行,表越大,查询数据所花费的时间就越多,如果表中查询的列有一个索引,MySQL能够快速到达一个位置去搜索数据文件,而不必查看所有数......