目录
一、适合创建索引
1、字段的数值有唯一性限制
2、频繁作为Where查询条件的字段
3、经常Group by和Order by的列
4、Update、Delete的where条件列
5、Distinct字段需要创建索引
6、多表Join连接操作时,创建索引注意事项
7、使用列的类型小的创建索引
8、使用字符串前缀创建索引
9、区分度高的列适合作为索引
10、使用最频繁的列放到联合索引的左侧
11、在多个字段都要创建索引的情况下,联合索引由于单值索引
二、不适合创建索引
1、在where中使用不到的字段不要设置索引
2、数据量小的表最好不要使用索引
3、有大量重复数据的列上不要建立索引
5、不建议用无序的值作为索引
8、删除不在使用或很少使用的索引
9、不要定义冗余或重复的索引
首页 数据库 mysql教程 MySQL索引创建原则的示例分析

MySQL索引创建原则的示例分析

Apr 17, 2023 pm 05:01 PM
mysql

    一、适合创建索引

    1、字段的数值有唯一性限制

    根据Alibaba规范,指明在业务上具有唯一特性的字段,即使是组合字段,也必须建成唯一索引。

    MySQL索引创建原则的示例分析

    例如,学生表中的学号时具有唯一性的字段,为该字段建立唯一性索引可以快速查询出某个学生的信息,如果使用姓名的话,可能存在同名的情况,从而降低查询速度。

    2、频繁作为Where查询条件的字段

    某个字段在Select语句的Where条件中经常被使用到,那么就需要给这个字段创建索引,尤其实在数据量大的情况下,创建普通索引就可以大幅提升查询效率。

    比如测试表student_info有100万数据,假设查询student_id=112322的用户信息,如果没有对student_id字段创建索引,查询结果如下:

    select course_id, class_id, name, create_time,student_id from student_info where student_id = 112322;# 花费211ms
    登录后复制

    MySQL索引创建原则的示例分析

    为student_id创建索引后,查询结果如下:

    alter table student_info add index idx_sid(student_id);
    select course_id, class_id, name, create_time,student_id from student_info where student_id = 112322;# 花费3ms
    登录后复制

    MySQL索引创建原则的示例分析

    3、经常Group by和Order by的列

    索引就是让数据按照某种顺序进行存储或检索,因此当使用Group by对数据进行分组查询或使用Order by对数据进行排序的时候 ,就需要对分组或排序的字段进行索引。如果待排序的列有多个,那可以在这些列上建立组合索引。

    比如,按照student_id对学生选秀的课程进行分组,显示不同的student_id和课程的数量,显示100条。如果不对student_id创建索引,查询结果如下:

    select student_id,count(*) as num from student_info group by student_id limit 100;#花费2.466s
    登录后复制

    MySQL索引创建原则的示例分析

    为student_id创建索引后,查询结果如下:

    alter table student_info add index idx_sid(student_id);
    select student_id,count(*) as num from student_info group by student_id limit 100;#花费6ms
    登录后复制

    MySQL索引创建原则的示例分析

    对于既有group by又有order by的查询语句,建议最好建立联合索引,并且将group by中的字段放到order by字段的前边,满足‘最左前缀匹配原则’,这样索引的利用率就会高,自然查询的效率也就会高;同时8.0之后的版本支持降序索引,如果order by之后的字段时降序的,可以考虑直接创建降序索引,也会提高查询效率。

    4、Update、Delete的where条件列

    对数据按照某个条件进行查询后再进行Update或Delete的操作,如果对Where字段创建了索引,就能答复提升效率。原因是因为需要先根据Where条件列检索出来这条记录,然后再对他进行更新或删除。如果进行更新的时候,更新的字段是非索引字段,提升效率会更明显,这是因为费索引字段更新不需要对所以进行维护。

    比如对student_info表中的name字段为sdfasdfas123123的数据修改student_id为110119,在没有对name字段建立索引的情况下,执行情况如下:

    update student_info set student_id = 110119 where name = 'sdfasdfas123123';#花费549ms
    登录后复制

    MySQL索引创建原则的示例分析

    添加索引后,执行情况如下:

    alter table student_info add index idx_name(name);
    update student_info set student_id = 110119 where name = 'sdfasdfas123123';#花费2ms
    登录后复制

    MySQL索引创建原则的示例分析

    5、Distinct字段需要创建索引

    有时候需要对某个字段进行去重,使用Distinct,那么对这个创建索引也会提升查询效率。

    比如查询课程表中不同student_id都有哪些,如果没有为student_id创建索引,执行情况如下:

    select distinct(student_id) from student_id;#花费2ms
    登录后复制

    MySQL索引创建原则的示例分析

    创建索引后,执行情况如下:

    alter table student_info add index idx_sid(student_id);
    select distinct(student_id) from student_id;#花费0.1ms
    登录后复制

    6、多表Join连接操作时,创建索引注意事项

    首先,连接表的数据量尽量不超过3张,因为每增加一张表就相当于增加了一次嵌套的循环,数量级增长非常快,严重影响查询效率。其次,对Where条件创建索引,因为Where才是对数据条件的过滤,如果再数据量非常大的情况下,没有Where条件过滤时非常可怕的,最后,对于连接的字段创建索引,并且改字段再多张表中类型必须一致。

    MySQL索引创建原则的示例分析

    比如,只对student_id创建索引,查询结果如下:

    select course_id, name, student_info.student_id,course_name
    from student_info join course
    on student_info.course_id = course.course_id
    where name = 'aAAaAA'; #花费176ms
    登录后复制

    MySQL索引创建原则的示例分析

    给name字段创建索引后,查询结果如下:

    alter table student_info add index idx_name(name);
    select course_id, name, student_info.student_id,course_name
    from student_info join course
    on student_info.course_id = course.course_id
    where name = 'aAAaAA'; #花费2ms
    登录后复制

    MySQL索引创建原则的示例分析

    7、使用列的类型小的创建索引

    这里所说的类型小值意思是该类型表示的数据范围的大小。比如在定义表结构的时候要显示的指定列的类型,以整数类型为例,有TINYINT、MEDIUMINT、INT、BIGINT等,他们占用的存储空间依次递增,能表示的数据范围也是一次递增。如果相对某个整数列建立索引的话,在表示的整数范围允许的情况下,尽量让索引列使用较小的类型,例如能使用INT不要使用BIGINT,能使用MEDIUMINT不使用INT,原因如下:

    • 数据类型越小,在查询时进行的比较操作越快

    • 数据类型越小,索引占用的空间就越少,在一个数据页内就可以存下更多的记录,从而减少磁盘I/O带来的性能损耗,也就意味着可以存储更多的数据在数据页中,提高读写效率。

    上述对于主键来说很合适,因为在聚簇索引中既存储了数据,也存储了索引,可以很好的减少磁盘I/O;而对于二级索引来说,还需要一次回表操作才能查到完整的数据,也就能加了一次磁盘I/O。

    8、使用字符串前缀创建索引

    根据Alibaba开发手册,在字符串上建立索引时,必须指定索引长度,没有必要对全字段建立索引。

    MySQL索引创建原则的示例分析

    比如有一张商品表,表中的商品描述字段较长,在描述字段上建立前缀索引如下:

    create table product(id int, desc varchar(120) not null);
    alter table product add index(desc(12));
    登录后复制

    区分度的计算可以使用count(distinct left(列名, 索引长度))/count(*)来确定。

    9、区分度高的列适合作为索引

    列的基数值得时某一列中不重复数据的个数,比如说某个列包含值2,5,3,6,2,7,2,虽然有7条记录,但该列的基数却是5,也就是说,在记录行数一定的情况下,列的基数越大,该列中的值就越分散;列的基数越小,该列中的值就越集中。这里列的基数指标非常重要,直接影响是否能有效利用索引。最好为列的基数大的列建立索引,为基数太小的列建立索引效果反而不好。

    可以使用公式select count(distinct col)/count(*) from table 来计算区分度,越接近1区分度越好。

    10、使用最频繁的列放到联合索引的左侧

    这条就是通常说的最左前缀匹配原则。 通俗来讲就是将Where条件后经常使用的条件字段放在索引的最左边,将使用频率相对低的放到右边。

    11、在多个字段都要创建索引的情况下,联合索引由于单值索引

    二、不适合创建索引

    1、在where中使用不到的字段不要设置索引

    通常索引的建立是有代价的,如果建立索引的字段没有出现在where条件(包括group by、order by)中,建议一开始就不要创建索引或将索引删除,因为索引的存在也会占用空间。

    2、数据量小的表最好不要使用索引

    3、有大量重复数据的列上不要建立索引

    在条件表达式中经常用到的不同值较多的列上建立索引,但字段中如果有大量重复数据,也不用创建索引。比如学生表中的性别字段,只有男和女两种值,因此无需建立索引。如果建立索引,不但不会提高查询效率,反而会严重降低数据更新速度。

    4、避免对经常更新的表创建过多的索引

    • 频繁更新的字段不一定要创建索引,因为更新数据的时候,索引也要跟着更新,如果索引太多,更新的时候会造成服务器压力,从而影响效率。

    • 避免对经常更新的表创建过多的索引,并且索引中的列尽可能少。此时虽然提高了查询速度,同时也会降低更新表的速度。

    5、不建议用无序的值作为索引

    例如身份证、UUID(在索引比较时需要转为ASCII,并且插入时可能造成页分裂)、MD5、HASH、无序长字符串等。

    6、删除不在使用或很少使用的索引

    表中的数据被大量更新或者数据的使用方式被改变后,原有的一些索引可能不会被使用到。DBA应定期找出这些索引并将之删除,从而较少无用索引对更新操作的影响。

    7、不要定义冗余或重复的索引

    例如身份证、UUID(在索引比较时需要转为ASCII,并且插入时可能造成页分裂)、MD5、HASH、无序长字符串等。

    8、删除不在使用或很少使用的索引

    表中的数据被大量更新或者数据的使用方式被改变后,原有的一些索引可能不会被使用到。DBA应定期找出这些索引并将之删除,从而较少无用索引对更新操作的影响。

    9、不要定义冗余或重复的索引

    以上是MySQL索引创建原则的示例分析的详细内容。更多信息请关注PHP中文网其他相关文章!

    本站声明
    本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

    热AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智能驱动的应用程序,用于创建逼真的裸体照片

    AI Clothes Remover

    AI Clothes Remover

    用于从照片中去除衣服的在线人工智能工具。

    Undress AI Tool

    Undress AI Tool

    免费脱衣服图片

    Clothoff.io

    Clothoff.io

    AI脱衣机

    AI Hentai Generator

    AI Hentai Generator

    免费生成ai无尽的。

    热门文章

    R.E.P.O.能量晶体解释及其做什么(黄色晶体)
    1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O.最佳图形设置
    1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
    威尔R.E.P.O.有交叉游戏吗?
    1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

    热工具

    记事本++7.3.1

    记事本++7.3.1

    好用且免费的代码编辑器

    SublimeText3汉化版

    SublimeText3汉化版

    中文版,非常好用

    禅工作室 13.0.1

    禅工作室 13.0.1

    功能强大的PHP集成开发环境

    Dreamweaver CS6

    Dreamweaver CS6

    视觉化网页开发工具

    SublimeText3 Mac版

    SublimeText3 Mac版

    神级代码编辑软件(SublimeText3)

    mysql:简单的概念,用于轻松学习 mysql:简单的概念,用于轻松学习 Apr 10, 2025 am 09:29 AM

    MySQL是一个开源的关系型数据库管理系统。1)创建数据库和表:使用CREATEDATABASE和CREATETABLE命令。2)基本操作:INSERT、UPDATE、DELETE和SELECT。3)高级操作:JOIN、子查询和事务处理。4)调试技巧:检查语法、数据类型和权限。5)优化建议:使用索引、避免SELECT*和使用事务。

    phpmyadmin怎么打开 phpmyadmin怎么打开 Apr 10, 2025 pm 10:51 PM

    可以通过以下步骤打开 phpMyAdmin:1. 登录网站控制面板;2. 找到并点击 phpMyAdmin 图标;3. 输入 MySQL 凭据;4. 点击 "登录"。

    MySQL:世界上最受欢迎的数据库的简介 MySQL:世界上最受欢迎的数据库的简介 Apr 12, 2025 am 12:18 AM

    MySQL是一种开源的关系型数据库管理系统,主要用于快速、可靠地存储和检索数据。其工作原理包括客户端请求、查询解析、执行查询和返回结果。使用示例包括创建表、插入和查询数据,以及高级功能如JOIN操作。常见错误涉及SQL语法、数据类型和权限问题,优化建议包括使用索引、优化查询和分表分区。

    为什么要使用mysql?利益和优势 为什么要使用mysql?利益和优势 Apr 12, 2025 am 12:17 AM

    选择MySQL的原因是其性能、可靠性、易用性和社区支持。1.MySQL提供高效的数据存储和检索功能,支持多种数据类型和高级查询操作。2.采用客户端-服务器架构和多种存储引擎,支持事务和查询优化。3.易于使用,支持多种操作系统和编程语言。4.拥有强大的社区支持,提供丰富的资源和解决方案。

    redis怎么使用单线程 redis怎么使用单线程 Apr 10, 2025 pm 07:12 PM

    Redis 使用单线程架构,以提供高性能、简单性和一致性。它利用 I/O 多路复用、事件循环、非阻塞 I/O 和共享内存来提高并发性,但同时存在并发性受限、单点故障和不适合写密集型工作负载的局限性。

    MySQL和SQL:开发人员的基本技能 MySQL和SQL:开发人员的基本技能 Apr 10, 2025 am 09:30 AM

    MySQL和SQL是开发者必备技能。1.MySQL是开源的关系型数据库管理系统,SQL是用于管理和操作数据库的标准语言。2.MySQL通过高效的数据存储和检索功能支持多种存储引擎,SQL通过简单语句完成复杂数据操作。3.使用示例包括基本查询和高级查询,如按条件过滤和排序。4.常见错误包括语法错误和性能问题,可通过检查SQL语句和使用EXPLAIN命令优化。5.性能优化技巧包括使用索引、避免全表扫描、优化JOIN操作和提升代码可读性。

    MySQL的位置:数据库和编程 MySQL的位置:数据库和编程 Apr 13, 2025 am 12:18 AM

    MySQL在数据库和编程中的地位非常重要,它是一个开源的关系型数据库管理系统,广泛应用于各种应用场景。1)MySQL提供高效的数据存储、组织和检索功能,支持Web、移动和企业级系统。2)它使用客户端-服务器架构,支持多种存储引擎和索引优化。3)基本用法包括创建表和插入数据,高级用法涉及多表JOIN和复杂查询。4)常见问题如SQL语法错误和性能问题可以通过EXPLAIN命令和慢查询日志调试。5)性能优化方法包括合理使用索引、优化查询和使用缓存,最佳实践包括使用事务和PreparedStatemen

    怎样建立sql数据库 怎样建立sql数据库 Apr 09, 2025 pm 04:24 PM

    构建 SQL 数据库涉及 10 个步骤:选择 DBMS;安装 DBMS;创建数据库;创建表;插入数据;检索数据;更新数据;删除数据;管理用户;备份数据库。

    See all articles