首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Mysql合理建立索引,索引优化

写下这篇文章就是为了记录一下对索引的优化,合理建立索引。 什么是索引 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。...建立索引的场景 索引不是越多越好,因为每次更新、插入数据,就需要对索引文件进行变动,会减低该类型操作的执行效率。 如果建立索引的字段太多,影响就会很大。 所以我们只在合理的字段上建立索引。...123456 否则发生类型转换,索引失效,其他类型的字段 比如日期等 也同理 当使用的条件语句,预计结果数量超过全表数据的一定比例时,会转为全表扫描(mysql一般是30%左右)这就是为什么在建立索引的时候要选择维度...组合索引时使用的条件语句。 上面举例的一些场景都是比较容易理解的。组合索引还没涉及,往下继续介绍。 mysql中,多个索引同时使用?...,mysql会选择一个使用。

4.8K20

mysql建立联合索引_mysql之联合索引

mysql之联合索引测试: 前期准备: 建立联合索引?...,则该索引仅出现在key列表中 rows: 根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数 Extra: 1、Using filesort : mysql对数据使用一个外部的索引排序...也就是说mysql无法利用索引完成的排序操作成为“文件排序” 2、Using temporary: 使用临时表保存中间结果,也就是说mysql在对查询结果排序时使用了临时表,常见于order by 和...就是select列表中的字段,只用从索引中就能获取,不必根据索引再次读取数据文件,换句话说查询列要被所建的索引覆盖。...测试语句是否使用了索引: 网上说联合索引 test_col1_col2_col3 实际建立了(col1)、(col1,col2)、(col,col2,col3)三个索引

5K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    MySQL索引建立方式

    MySQL索引建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。...打个比方,如果合理的设计且使用索引MySQL是一辆兰博基尼的话,那么没有设计和使用索引MySQL就是一个人力三轮车。...因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。 建立索引会占用磁盘空间的索引文件。 ---- 普通索引 创建索引 这是最基本的索引,它没有任何限制。...以下实例为在表中添加索引mysql> ALTER TABLE testalter_tbl ADD INDEX (c); 你还可以在 ALTER 命令中使用 DROP 子句来删除索引。...实例如下: mysql> ALTER TABLE testalter_tbl MODIFY i INT NOT NULL; mysql> ALTER TABLE testalter_tbl ADD PRIMARY

    2.3K00

    Mysql常用的建立索引规则

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

    2.9K10

    MySQL建立索引的优点和缺点

    建立索引的优缺点: 为什么要创建索引呢? 这是因为,创建索引可以大大提高系统的性能。...第二、索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间。如果要建立聚簇索引,那么需要的空间就会更大。...第三、当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。 什么样的字段适合创建索引: 索引建立在数据库表中的某些列的上面。...建立索引,一般按照select的where条件来建立,比如: select的条件是where f1 and f2,那么如果我们在字段f1或字段f2上简历索引是没有用的,只有在字段f1和f2上同时建立索引才有用等...(普通索引) mysql> alter table table_name add index index_name ( `column` ) 5.多列索引 (聚簇索引) mysql

    2.2K20

    【说站】mysql有哪些建立索引的方法

    mysql有哪些建立索引的方法 1、最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、 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、尽量选择区分度高的列作为索引,...所以语句应该写成create_time = unix_timestamp(’2014-05-29’); 以上就是mysql建立索引的方法,大家学会后也试着建立索引吧。...更多mysql学习指路:MySQL 推荐操作系统:windows7系统、mysql5.8、DELL G3电脑

    1.4K20

    MySQL建立自己的哈希索引(书摘备查)

    MySQL中,只有Memory存储引擎支持显式的哈希索引,但是可以按照InnoDB使用的方式模拟自己的哈希索引。这会让你得到某些哈希索引的特性,例如很大的键也只有很小的索引。...想法非常简单:在标准B-Tree索引上创建一个伪哈希索引。它和真正的哈希索引不是一回事,因为它还是使用B-Tree索引进行查找。然而,它将会使用键的哈希值进行查找,而不是键自身。...通常会按照下面的方式来查找URL表: select id from url where url='http://www.mysql.com'; 但是,如果移除url列上的索引并给表添加一个被索引的...//www.mysql.com'); 这种方式很不错,因为MysSQL查询优化器注意到url_crc列上有很小的、选择性很高的索引,并且它会使用里面的值进行索引查找。...替代方案是把完整的URL索引为字符串,它要慢得多。 这个办法的一个缺点是要维护哈希值。你可以手工进行维护,在MySQL 5.0及以上版本中,可以使用触发器来进行维护。

    2.2K30

    什么时候 MySQL 查询会变慢

    前面几篇文章和小伙伴们聊的基本上都是从索引的角度去优化 MySQL 查询,然而,索引创建的好,并不意味着查询就一定快,影响查询效率的因素特别多,今天我们就来聊一聊这些可能影响到查询的因素。 1....我们来看如下一张图: 首先,用户通过连接器和服务端之间建立通信连接,这个说白了就是一个 Socket 通信,用户名/密码的校验,用户权限的判断等等,都是在这个连接器中完成的。...最后就是执行器了,执行器调用搜索引擎提供的具体接口去获取数据。 这张图大家大概有个印象,在后续的 MySQL 查询和优化中,很多东西就容易理解了。 接下来我们就来看看什么情况下查询会变慢。 2....如果在查询的时候使用了唯一性索引的话,那么查询到记录之后 MySQL 就停止扫描了;但是如果查询的时候使用的是非唯一性索引的话,那么扫描到第一条记录之后,还会继续向后扫描,直到扫描到第一条不满足条件的记录为止...直接从索引中过滤出来想要的值并返回给客户端,这种时候,过滤虽然发生在 MySQL Server 层,但是由于不需要回表,效率也还过得去。

    17620

    分区表建立索引

    PARTITION pm11_ix VALUES LESS THAN (12)        PARTITION pm12_ix VALUES LESS THAN (MAXVALUE)); 分区表和一般表一样可以建立索引...3.1     局部索引分区的建立: SQL> create index dinya_idx_t on dinya_test(item_id)   2  local   3  (   4     partition...client           1  sorts (memory)           0  sorts (disk)           2  rows processed SQL> 3.2     全局索引分区的建立...全局索引建立时global 子句允许指定索引的范围值,这个范围值为索引字段的范围值: SQL> create index dinya_idx_t on dinya_test(item_id)   2  ...SQL>         本例中对表的item_id字段建立索引分区,当然也可以不指定索引分区名直接对整个表建立索引,如: SQL> create index dinya_idx_t on dinya_test

    1.9K100

    MySQL 升级到 8.0 变慢问题分析

    整个过程持续了大概一个小时,直到给某条业务 SQL 对应的表加上索引,问题才得到解决。...这个基表的名字和 MySQL 5.7 中不一样了,它的行为也发生了变化,就是这个行为的变化在某些场景下阻塞了业务 SQL,导致大量业务 SQL 执行变慢。...从 data_locks 表里读取数据的线程长时间持有 trx_sys->mutex 互斥量,就会长时间阻塞其它 SQL 执行,导致其它 SQL 排队等待,出现堆积,表现出来的状态就是 MySQL 整体都变慢了...背景介绍小节中提到的那条业务 SQL 对应的表上创建了一个索引。...在那个表上创建索引之后,那条业务 SQL 执行过程中就不需要对 300 万条记录加锁了,而是只会对少量记录加锁,data_locks 表中的数据量也就变的很少了,不需要长时间持有 trx_sys->mutex

    1K20

    mysql 前缀索引_MySQL前缀索引

    有时候需要索引很长的字符字段列,这会增加索引的存储空间以及降低索引的查询效率,一种策略是可以使用哈希索引,还有一种就是使用前缀索引。...前缀索引是选择字符列的前n个字符作为索引,这样可以大大节约索引空间,从而提高索引效率。...前缀索引的选择性 使用前缀索引,在一些场景下可能使得重复的索引值变多,索引的选择性变低,查找时需要过滤更多的行,因此建立前缀索引也要考虑前缀的索引选择性不能太低。...MySQL 无法使用前缀索引做 ORDER BY 和 GROUP BY , 也无法使用前缀索引做覆盖扫描。...后缀索引 MySQL 没有提供后缀索引,事实上,一些业务场景对后缀匹配选择性更高,比如我曾经参与过的项目,手机的入网标示imei号,前缀都是86等固定的国家编号开头,这个时候可以将字符反转后存储,就可以建立选择性较高的前缀索引

    4.8K30

    千万级MySQL数据库建立索引,提高性能的秘诀

    索引优化 建议在经常作查询选择的字段、经常作表连接的字段以及经常出现在order by、group by、distinct 后面的字段中建立索引。...InnoDB需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。...AUTO_INCREMENT:在MyISAM中,可以和其他字段一起建立联合索引。引擎的自动增长列必须是索引,如果是组合索引,自动增长可以不是第一列,它可以根据前面几列进行排序后递增。...千万级MySQL数据库建立索引的事项及提高性能的手段 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。...然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。

    3.8K10

    浅谈索引的优缺点和建立索引的原则

    索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。...建索引的几大原则 1.最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、 3 and...d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。...=和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式 3.尽量选择区分度高的列作为索引,区分度的公式是...不应该建立索引的情况 对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。

    3.1K10

    mysql前缀索引使用,Mysql:前缀索引索引

    可以像普通索引一样使用mysql前缀索引吗?...解决方法: 如果你想一下,MySQL仍会给你正确的答案,即使没有索引…它只是不会那么快……所以,是的,你仍然会得到一个正确的答案前缀索引....前缀索引的排序不超出前缀的长度.如果您的查询使用完整索引来查找行,您通常会发现返回的行是按索引顺序隐式排序的.如果您的应用程序需要这种行为,那么它当然会期待它不应该期望的东西,因为除非您显式ORDER...并且,前缀索引不能用作覆盖索引.覆盖索引是指SELECT中的所有列恰好包含在一个索引中的情况(加上可选的主键,因为它也总是存在).优化器将直接从索引读取数据,而不是使用索引来标识要在主表数据中查找的行....标签:mysql,indexing,innodb 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/142503.html原文链接:https://javaforall.cn

    5.3K20

    Mysql覆盖索引_mysql索引长度限制

    只扫描索引而无需回表的优点: 1.索引条目通常远小于数据行大小,只需要读取索引,则mysql会极大地减少数据访问量。...(innodb的二级索引在叶子节点中保存了行的主键值,所以如果二级主键能够覆盖查询,则可以避免对主键索引的二次查询) 覆盖索引必须要存储索引列的值,而哈希索引、空间索引和全文索引不存储索引列的值,所以mysql...当发起一个索引覆盖查询时,在explain的extra列可以看到using index的信息 覆盖索引的坑:mysql查询优化器会在执行查询前判断是否有一个索引能进行覆盖,假设索引覆盖了where条件中的字段...如上图则无法使用覆盖查询,原因: 1.没有任何索引能够覆盖这个索引。因为查询从表中选择了所有的列,而没有任何索引覆盖了所有的列。 2.mysql不能在索引中执行LIke操作。...mysql能在索引中做最左前缀匹配的like比较,但是如果是通配符开头的like查询,存储引擎就无法做比较匹配。

    7.9K30

    利用Lucene的IndexWriter建立索引(详解)

    利用Lucene的IndexWriter建立索引(详解) /*  * 建立索引,然后把建立后的文档添加到索引中去  * 提示先使用Document和Field把Field加入到Document中去,  ...* 接着把Document建立成为一个索引  * */ package comThree; import java.io.IOException; import org.apache.lucene.analysis.standard.StandardAnalyzer...org.apache.lucene.document.Field; import org.apache.lucene.index.IndexWriter; public class BookIndex{ //创建索引的目录...private String INDEX_PATH = "E:\\Lucene项目\\索引目录"; Document  bookdoc1 = null; public BookIndex(){ bookdoc1...writer.close(); System.out.println("完成索引的创建并且存储完毕, 索引的存放位置在:" + INDEX_PATH); }catch(IOException e){ e.printStackTrace

    54210

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭
      领券