首页
学习
活动
专区
圈层
工具
发布

mysql 添加索引规则

基础概念

MySQL索引是一种数据结构,它帮助数据库高效地获取数据。索引可以大大提高数据检索速度,优化数据库性能。索引类似于书籍的目录,通过目录可以快速找到所需内容,而无需翻阅整本书。

相关优势

  1. 提高查询速度:索引可以显著减少数据库需要扫描的数据量,从而加快查询速度。
  2. 优化排序和分组:索引可以帮助数据库更快地完成排序和分组操作。
  3. 唯一性约束:通过创建唯一索引,可以确保表中的某些列的值是唯一的。

类型

  1. 单列索引:基于单个列创建的索引。
  2. 复合索引:基于多个列创建的索引,这些列的组合必须是唯一的。
  3. 唯一索引:确保索引列的值是唯一的。
  4. 全文索引:用于全文搜索,适用于文本数据。
  5. 空间索引:用于地理空间数据类型。

应用场景

  • 频繁查询的列:对于经常用于查询条件的列,应创建索引以提高查询效率。
  • 排序和分组:如果经常需要对某些列进行排序或分组,这些列也应该有索引。
  • 连接操作:在连接多个表时,连接条件的列应有索引。

添加索引规则

  1. 选择合适的列:选择经常用于查询条件、排序、分组的列创建索引。
  2. 避免过度索引:过多的索引会增加写操作的开销,并占用额外的存储空间。
  3. 考虑索引的选择性:选择性高的列(即列中不同值的数量多)更适合创建索引。
  4. 复合索引的顺序:复合索引中列的顺序很重要,应将选择性高的列放在前面。

示例代码

假设我们有一个名为users的表,其中包含id、name、email和age列,我们希望提高基于email和age的查询效率。

代码语言:txt
复制
CREATE INDEX idx_email_age ON users(email, age);

遇到的问题及解决方法

问题:为什么添加索引后查询速度没有提升?

原因:

  1. 索引未被使用:查询条件可能没有使用到索引列,或者使用了函数、操作符导致索引失效。
  2. 数据量较小:对于数据量较小的表,索引带来的性能提升不明显。
  3. 查询优化器选择:数据库查询优化器可能认为全表扫描比使用索引更快。

解决方法:

  1. 检查查询条件:确保查询条件中使用了索引列,并且没有使用导致索引失效的函数或操作符。
  2. 分析查询计划:使用EXPLAIN语句查看查询计划,了解数据库是如何执行查询的。
  3. 优化查询语句:根据查询计划的结果,优化查询语句,确保索引被有效利用。

示例代码:检查查询计划

代码语言:txt
复制
EXPLAIN SELECT * FROM users WHERE email = 'example@example.com' AND age = 30;

通过以上步骤,可以更好地理解和应用MySQL索引,从而优化数据库性能。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

MySQL索引规则

索引(Index)是帮助 MySQL 高效获取数据的数据结构。但是索引的规则有哪些呢?...索引一定要命名规范,哪个库哪个表哪几个字段哪种类型索引 选择唯一性索引——唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录 为经常需要排序、分组和联合操作的字段建立索引 为常作为查询条件的字段建立索引...尽量使用数据量少的索引,大字段尽量不要使用索引,如果使用用MD5值 如果索引的值很长,那么查询的速度会受到影响 尽量使用前缀来索引-如果索引字段的值很长,最好使用值的前缀来索引 删除不再使用或者很少使用的索引...最左前缀匹配原则 尽量选择区分度高的列作为索引区分度的公式是表示字段不重复的比例 索引列不能参与计算,保持列“干净”:带函数的查询不参与索引 尽量的扩展索引,不要新建索引 尽量索引覆盖,不要回表操作...如果是多个索引,指定索引提高查询效率 索引固然可以提高查询效率的,但是也有自己的局限性,数据搜索还是适合用ElasticSearch,但是mysql要做持久化,同步ES两种方法:一种是ES的java

1.5K20
  • mysql 查看索引、添加索引、删除索引命令添加索引删除索引

    查看索引 mysql> show index from tblname; mysql> show keys from tblname; mysql> show index from center_bank_rate...· Non_unique 如果索引不能包括重复词,则为0。如果可以,则为1。 · Key_name 索引的名称。 · Seq_in_index 索引中的列序列号,从1开始。...· Collation 列以什么方式存储在索引中。在MySQL中,有值‘A’(升序)或NULL(无分类)。 · Cardinality 索引中唯一值的数目的估计值。...基数越大,当进行联合时,MySQL使用该索引的机 会就越大。 · Sub_part 如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为NULL。...· Comment 添加索引 ALTER TABLE Persons ADD CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName) 删除索引 mysql> alter

    5.2K10

    MySQL索引使用规则总结

    如何加快查询,最直接有效的办法就是增加索引,在不使用索引的情况下试图采用其他方式加快查询就是在浪费时间。本文先介绍下MySQL索引的基本数据结构,再对索引的基本规则做下总结。...MySQL索引实现 MyISAM索引实现 数据与索引是分开存放(图一); 新增数据直接追加写数据文件,同时更新索引; B+树的叶子节点上存储的是数据的实际地址偏移; 主索引与辅助索引(图二)在数据结构上没有区别...例如:对班级表格的性别字段的索引只有两个值’F’,’M’,采用性别别的索引无论怎么查询,得到的是数据表的一半左右的记录。MySQL的查询优化逻辑甚至不会选择对于这样的索引,而改成遍历搜索。...创建了N个列的符合索引,实际上创建了MySQL能够使用的n个索引。例如某表的复合索引 index(国家,省份,城市)。...参考: 1、MySQL技术内幕:InnoDB存储引擎 2、MySQL技术内幕:第4版 3、MySQL高效编程 4、MySQL的官方手册 5、http://km.oa.com/articles/show/

    4.6K00

    Mysql常用的建立索引规则

    建立索引的规则 建立索引常用的规则如下: 表的主键、外键必须有索引; 数据量超过300的表应该有索引; 经常与其他表进行连接的表,在连接字段上应该建立索引; 经常出现在Where子句中的字段,非凡是大表的字段...,应该建立索引; 索引应该建在选择性高的字段上(枚举型字段不建索引); 索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引; 复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替: 正确选择复合索引中的主列字段...假如是,则可以建立复合索引;否则考虑单字段索引; 假如复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引; 假如复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段...; 假如既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引; 频繁进行数据操作的表,不要建立太多的索引; 删除无用的索引,避免对执行计划造成负面影响; ​ 以上是一些普遍的建立索引时的判定依据...因为太多的索引与不充分、不正确的索引对性能都毫无益处:在表上建立的每个索引都会增加存储开销,索引对于插入、删除、更新操作也会增加处理上的开销。 ​

    3.8K10

    MySQL理解索引、添加索引的原则 转

    索引用于快速找出在某个列中有一特定值的行。不使用索引,MySQL必须从第1条记录开始然后读完整个表直到找出相关的行,还需要考虑每次读入数据页的IO开销。...MySQL使用B树构造索引的情况下,是由叶子指向具体的页和记录的。并且一个叶子有一个指针指向下一个叶子。...使用索引需要注意: ⑴只对WHERE和ORDER BY需要查询的字段设置索引,避免无意义的硬盘开销; ⑵组合索引支持前缀索引; ⑶更新表的时候,如增删记录,MySQL会自动更新索引,保持树的平衡;因此更多的索引意味着更多的维护成本...所以,大多数情况下,有AB索引了,就可以不用在去建一个A索引了 详解: 联合索引又叫复合索引。对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。...两个或更多个列上的索引被称作复合索引。 利用索引中的附加列,您可以缩小搜索的范围,但使用一个具有两列的索引 不同于使用两个单独的索引。

    2.4K31

    ⑩② 【MySQL索引】详解MySQL`索引`:结构、分类、性能分析、设计及使用规则。

    索引的结构 索引结构: MySQL的索引是在存储引擎层实现的,不同的存储引擎有不同的结构。 ①B+Tree索引:最常见的索引类型,大部分引擎都支持B+树索引。...B+Tree索引 MySQL数据库中,支持hash索引的是Memory引擎,而InnoDB中具有自适应hash功能,hash索引是存储引擎根据B+Tree索引在指定条件下自动构建的。...MySQL的慢查询日志默认没有开启,需要在MySQL的配置文件/etc/my.cnf中配置相应信息: # /etc/my.cnf文件内: #开启MySQL慢查询开关 slow_query_log=1...索引的使用规则 最左前缀法则: 如果索引了多列(联合索引),要遵守最左前缀法则。最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列。如果跳跃某一列,索引将部分失效(后面的字段索引失效)。...即or连接的条件都需建立索引才能使得索引生效。 数据分布影响: 如果MySQL评估使用索引比全表更慢,则不使用索引。

    1.5K41

    MySQL 添加索引的优化与实践(大数据表添加索引)

    MySQL 添加索引的优化与实践 在数据库中,索引是提升查询性能的核心工具之一。MySQL 提供了丰富的索引选项,使得我们能够根据不同的查询需求和数据量来设计和优化索引。...本文将深入探讨 MySQL 中添加索引的一些常见问题、最佳实践以及如何在大数据量的表上高效添加索引,确保在不影响业务的前提下优化查询性能。 1. 为什么需要索引?...2.1 基本的索引添加语法 在 MySQL 中,最常见的添加索引的 SQL 语句如下: CREATE INDEX index_name ON table_name (column1, column2);...SHOW INDEX FROM your_table; 4.3 索引添加时间过长 如果索引添加操作时间过长,可能是由于表中的数据量非常大,或者 MySQL 的内存配置不合理。...总结 为 MySQL 表添加索引是数据库优化中的重要环节,它能够显著提升查询性能,尤其是在数据量庞大的情况下。然而,添加索引时需要谨慎操作,尤其是在不影响正常业务的前提下。

    1.7K10

    Mysql高级4-索引的使用规则

    三、索引列运算   案例1:不要再索引列上进行运算操作,索引将失效     mysql> select * from account_transaction where trade_no = "...,可以看出possible_keys可能使用到的索引是primary主键索引,但是实际key这一列却是NULL,说明 primary 主键索引失效,查询用时1.6秒 mysql> select * from...只有or连接的字段中有非索引字段时才会无效 七、数据分布影响   如果mysql评估使用索引比全表更慢,则不使用索引 mysql> explain select * from account_transaction...trade_no+amonut做一个联合索引,看两个索引都满足的时候,会使用哪一个索引 mysql> show index from account_transaction; +------------...因为 trade_no 的单列索引和联合索引已经创建好了,这里只需要在创建一个 amount 的单列索引即可 mysql> show index from account_transaction; +-

    1K40

    MySQL 字符集、校对规则及索引

    校对规则则是指某种字符集下的排序规则。 在 MySQL 中,每一种字符集都会对应一系列的校对规则。...MySQL 采用的是类似继承的方式来指定字符集的默认值,每个数据库以及每张数据表都有自己的默认值,他们逐层继承。...比如:某个库中所有表的默认字符集,将是该数据库所指定的字符集(这些表在没有指定字符集的情况下,才会采用默认字符集) PS:整理自《Java 工程师修炼之道》 MySQL 索引使用的数据结构主要有 BTree...索引 和 哈希索引。...MySQL 的 BTree 索引使用的是 B 树中的 B+Tree,但在两种主要的存储引擎里,它们的实现方式是不同的。 MyISAM: B+Tree 叶节点的 data 域,存放的是数据记录的地址。

    1.3K30

    MySQL排序规则导致无法命中索引问题

    为每条记录检查范围(索引映射:N)(JSON 属性:message) MySQL 没有找到好的索引可以使用,但发现在知道前面表的列值后,可能会使用某些索引。...对于前面表中的每个行组合,MySQL 检查是否可以使用范围或索引合并访问方法来检索行。这不是很快,但比执行完全没有索引的连接要快。...原因 在SQL的关联条件中,关联字段类型相同,并不是隐式类型转换问题导致无法命中索引,那么我们开始排查两表的字符集、排序规则是否一致。...user表设计: vehicle表设计: 两表字符集均为utf8mb4,不会出现因字符集不同导致隐式转换的问题,那么对比排序规则发现两表的排序规则是不同的,排序规则不一致时,MySQL同样会进行强制类型转换...知识扩展 MySQL隐式转换导致无法命重索引的情况: If one or both arguments are NULL, the result of the comparison is NULL,

    1.4K30

    Mysql如何给字符串添加索引(前缀索引)

    在日常开发中,我们经常给字符串添加索引,那么给字段添加索引有什么技巧吗,我们看看下面的例子,我们给一个邮箱添加索引,应该如何添加呢 看看下面这条sql select * from user where...email ='jiepi@qq.com' 如果我们不添加索引,肯定是要进行全表扫描的,那么我们如何添加呢有两种方式 alter table user add index index1(email)...alter table user add index index2(email(6)) 上面两种方式都是在添加索引,不同点就是第二种添加的仅仅是邮箱的前缀索引,那么他的结构表现如下图 ?...前缀索引对覆盖索引的影响 上面我们分析了,前缀索引影响扫描的行数,其实,他也是会影响覆盖索引的,正如下面例子 select id,email from user where email='zhangsan...(18),完全包含字段的长度,但是我们依然要回表查找主键索引,因为系统并确定前缀索引是否有截断完成信息, 总结就是使用前缀索引,就无法使用覆盖索引。

    11.4K20

    如何添加合适的索引:MySql 数据库索引认知

    写在前面 博文内容涉及 Mysql 数据库索引简单认知,包括SQL执行过程,数据库数据存储原理。...简单认识索引 对于索引的添加,一般情况下,大都会说添加到要查询的字段,但是具体怎么添加,还是有一些注意事项的,有时候可能会适得其反。在这之前,我们先通过一个单表索引的 Demo 来认识一些专有名词。...复合索引可同时过滤 hotel_id 和 room_order_no,大幅减少需要回表的记录数量,添加复合索引,查询条件全部添加索引 ALTER TABLE `ams_accounts_order`...语法分析器 Parser 连接器收到 SQL 以后,会将 SQL 交给语法分析器进行处理,确认 SQL 的语法正确性,工作比较简单,根据规则生成对应的抽象语法树(AST,Abstract Syntax...实际上 Mysql 中数据库索引有两种: 聚簇索引 聚簇索引,聚簇索引的数据库记录和索引存储在一起,我们上面一直在讲的索引就是 聚簇索引,也叫一级索引,在 Mysql InnoDB 中,数据库表的主键就是聚簇索引

    2.1K00

    MySQL如何给JSON列添加索引(二)

    上一篇文章《MySQL 8.0 JSON增强到底有多强?...(一)》,我们简单介绍了MySQL中JSON数据类型,相信大家对JSON数据类型有了一定的了解,那么今天我们来简单看下如何在JSON列上添加索引? InnoDB支持虚拟生成列的二级索引。...在虚拟列上添加或删除二级索引是就地操作。 通过索引生成列以提供JSON列索引 JSON 不能直接对列进行索引。...要创建间接引用此类列的索引,可以定义一个生成列,该列提取应建立索引的信息,然后在生成的列上创建索引,如下所示: 说明:8.0和5.7都支持在生成列上添加索引 mysql>CREATE TABLE jemp...`c`,'$.name') 1 row in set (0.00 sec) 在MySQL 8.0.21和更高版本中,还可以JSON使用JSON_VALUE()带有表达式的函数在列上创建索引,该表达式可用于优化使用该表达式的查询

    9.7K11

    MYSQL 如果索引优化仅仅是添加索引,too young to simple

    MYSQL 的索引优化,如果此时此刻看到索引的优化,仅仅想到添加适合的索引,是不完全的,索引的优化本身就具有很多的不确定性。...(如果碎片率高,就需要通过整理碎片来提高性能) 以上就是随着时间的推移,索引的衰减 2 数据量的加大,索引的衰减,这点与MYSQL的表的BTREE+的数据存储雷同,基于索引本身随着数据流的加大,根+叶子节点可能会发展到超过...下面就通过各种语句,来获取索引的状态,动态调整索引,及时添加或清理失效的索引。...(仅仅在MYSQL8 中作用,information_schema) select it.name,ii.index_count from innodb_tables as it inner join...sys.statements_with_runtimes_in_95th_percentile where query like 'select%'; 以上的信息都可以帮助DB 人员快速了解当前的MYSQL

    1.2K10

    【MySQL】索引使用规则——(覆盖索引,单列索引,联合索引,前缀索引,SQL提示,数据分布影响,查询失效情况)

    前言 大家好吖,欢迎来到 YY 滴MySQL系列 ,热烈欢迎!...本章主要内容面向接触过C++的老铁 主要内容含: 一.索引使用规则 ※.验证索引效率提升 在未建立索引之前,执行如下SOL语句,查看SQL的耗时 耗时11s 利用主键索引(id)查,耗时0s...多条件联合查询时,MySQL优化器会评估哪个字段的索引效率更高,会选择该索引完成本次查询。 要强制就用可视日志。...我们针对profession创建一个单列索引 我们想要用这个单列索引,我们就建议索引use XX——MySQL不一定接受,要强制用force XX 6.数据分布影响——MySQL自我评估...如果MySQL评估使用索引比全表 更慢 ,则不使用索引 演示: 有一张表,我们关注其phone字段 当我们进行不同的范围查询时,MySQL会自己选择用不用索引 例如绿色部分用了联合索引,而红色部分要查找的数目已经大于总数一半了

    1.3K10

    MySQL索引优化指南:如何科学地为数据表添加索引

    MySQL索引优化指南:如何科学地为数据表添加索引 引言 在数据库优化中,索引(Index)是最常用的性能优化手段之一。...MySQL支持多种索引类型,包括: B-Tree索引(默认,适用于等值查询和范围查询) Hash索引(仅适用于等值查询,Memory引擎支持) 全文索引(FULLTEXT,适用于文本搜索) 空间索引(SPATIAL...(添加索引) ALTER TABLE users ADD INDEX idx_username (username); EXPLAIN SELECT FROM users WHERE username...: -- 未优化(可能使用文件排序,性能差) SELECT FROM products ORDER BY price DESC; -- 优化(添加索引) ALTER TABLE products ADD...(MySQL 5.6+) SELECT FROM sys.schema_unused_indexes; 5.

    72410
    领券