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

MySQL索引需要的原则

1.选择唯一性索引 唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录。例如,学生表中学号是具有唯一性的字段。为该字段建立唯一性索引可以很快的确定某个学生的信息。...因此,为这样的字段建立索引,可以提高整个表的查询速度。 4.限制索引的数目 索引的数目不是越多越好。每个索引都需要占用磁盘空间,索引越多,需要的磁盘空间就越大。修改表时,对索引的重构和更新很麻烦。...越多的索引,会使更新表变得很浪费时间。 5.尽量使用数据量少的索引 如果索引的值很长,那么查询的速度会受到影响。...mysql会一直向右匹配直到遇到范围查询(>、 3 and d = 4 如果建立(a,b,c,d)顺序的索引...比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式 10.尽量选择区分度高的列作为索引

1.7K20
您找到你想要的搜索结果了吗?
是的
没有找到

MySQL 索引

索引初识 首先通过一个例子来直观认识下索引对查询效率的提升。例子中使用的表为 employees(表语句见附录)。...数据库的索引 二叉查找树 那么数据库表中的索引是怎么实现的呢?其实,数据库表中的索引就是一种数据结构。以 MySQL 的 InnoDB 存储引擎为例,它使用的数据结构是 B+ 树。...为了解决这个问题,提出了平衡二叉查找树(AVL 树),它在二叉查找树的基础增加了约束,每个节点的左子树和右子树的高度差不能超过 1。刚才构建的第一棵二叉树便属于平衡二叉查找树。...假设某个数据表有 100 万行数据,如果使用平衡二叉树来索引,则得到的平衡二叉树树高为 20。一次查询可能需要访问 20 个数据块,也就是有可能会有 20 次磁盘 IO。...总结 本文首先通过一个例子直观看到索引对查询效率的提升。接下来对索引为什么能够提升查询效率做了讲解。最后介绍了 MySQL索引的存储结构。 [aurwk1x15e.png?

66320

mysql索引多了有什么坏处

建立索引常用的规则如下: 1、表的主键、外键必须有索引; 2、数据量超过300的表应该有索引; 3、经常与其他表进行连接的表,在连接字段应该建立索引; 4、经常出现在Where子句中的字段,特别是大表的字段...,应该建立索引; 5、索引应该建在选择性高的字段; 6、索引应该建在小字段,对于大的文本字段甚至超长字段,不要索引; 7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:  A、正确选择复合索引中的主列字段...如果是,则可以建立复合索引;否则考虑单字段索引;  C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;   D、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性...,考虑减少复合的字段;  C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引; 进行数据操作的表,不要建立太多的索引; 9、删除无用的索引,避免对执行计划造成负面影响...因为太多的索引与不充分、不正确的索引对性能都毫无益处:在表建立的每个索引都会增加存储开销,索引对于插入、删除、更新操作也会增加处理上的开销。

2.7K20

Mysql资料 索引--索引优化(

from s1 where name='egon' and email='asdf'; #可以 select * from s1 where email='alex@oldboy.com'; #不可以 mysql...=和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器 会帮你优化成索引可以识别的形式 #3.尽量选择区分度高的列作为索引,...所以语句应该写成create_time = unix_timestamp(’2014-05-29’); #5.需要在那些上面建立索引 解答: select user,host from mysql.user...索引一定要创建在 where 后的条件列上,而不是 select 后的选择数据的列上,另外,我们要尽量选择在唯一值多的大表的列建立索引,例如:男女性别列唯一值, 不适合建立索引 慢查询优化 先运行看看是否真的很慢...单表每个字段分别查询,看哪个字段的区分度最高 explain查看执行计划,是否与1预期一致(从锁定记录较少的表开始查询) order by limit 形式的sql语句让排序的表优先查 了解业务方使用场景 加索引时参照索引的几大原则

41400

Mysql索引解密()

索引是数据库概念最重要的概念之一,也是我们经常要使用的优化手段,索引的出现其实就是为了提高数据查询的效率,就像书的目录一样 索引的常见模型 索引的的提出是为了提高查询数据的效率,索引索引模型的概念使我们必须要知道的概念...在Mysql中,索引是存储引擎层实现的,索引并没有统一的标准,因此不同的存储引擎的索引结果不一样。...InnoDB的索引模型 在InnoDB中,表都是根据主键顺序以多音的形式存放的,这种存放的表为索引表,InnoDB使用的B+树索引模型,每一个索引对应InnoDB对应一棵B+树,如下图 mysql>...主键索引的叶子节点存在是整合的数据,主键索引就是聚簇索引 非主键索引的叶子节点的内容是主键的值,非主键索引就是非聚簇索引 基于主键索引和非主键索引的区别 如果语句是如下sql,他是根据主键索引查询...索引的维护 B+树为了维护索引的有序性,在插入新值的时候需要做必要的维护,以上面为例,当要插入一条id=700的数据,就直接在R5后面插入一条数据,但是如果要插入一条数据是id=400,对比较麻烦,因为逻辑要挪动数据

43250

java mysql 分区表_mysql分区表

对用户来说,分区表是一个独立的逻辑表,但是底层由多个物理子表组成。实现分区的代码实际是对一组底层表的句柄对象的封装。 mysql在创建表时使用PARTITION BY子句定义每个分区存放的数据。...3.分区表的数据可以分布在不同的物理设备,从而高效地利用多个硬件设备。 4.可以使用分区表来避免某些特殊的瓶颈,例如InnoDB的单个索引的互斥访问,ext3文件系统的inode锁竞争等。...分区表本身也有一些限制,下面是其中比较重要的几点: 1.一个表最多只能有1024个分区。 2.在mysql5.1中,分区表达式必须是整数,或者是返回整数的表达式。...在mysql5.5中,某些场景中可以直接使用列进行分区。 3.如果分区字段中有主键或者唯一索引的列,那么所有主键列和唯一索引列都必须包含进来。 4.分区表中无法使用外键约束。...分区表的操作按照下面的操作逻辑进行: select查询 当查询一个分区表的时候,分区层先打开并锁住所有的底层表,优化器先判断是否可以过滤部分分区,然后再调用对应的存储引擎接口访问各个分区的数据。

7.8K10

mysql索引优点及几大原则

索引的优点:   最常见的B-Tree索引,按照顺序存储数据,所以MYSQL可以用来做order by和group by操作。因为数据是有序的,所以B-Tree也就会将相关的列值存储在一起。...mysql索引的几大原则 1.选择唯一性索引   唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录。例如,学生表中学号是具有唯一性的字段。...7.最左前缀匹配原则   当对多个列同时索引时,MySQL会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配 聚簇索引(Clustered Indexes)   聚簇索引并不是一种单独的索引类型...具体的细节依赖于其实现方式,InnoDB的聚族索引实际在同一个结构中保存了B-Tree索引和数据行。当表有聚族索引时,它的数据行存放在索引的叶子页中。...除聚簇索引之外的表的每个非聚簇索引都是二级索引,又叫辅助索引(secondary indexes)。

94900

【Oracle】-【索引】先查数据再索引,还是先索引再插数据?

问题: 1、新建一个表结构,创建索引,将百万或千万级的数据使用insert导入该表。 2、新建一个表结构,将百万或千万级的数据使用isnert导入该表,再创建索引。 这两种效率哪个高呢?...我感觉无论先还是后索引,当有数据时都需要update索引数据,问题是有索引的情况下插数据与有数据的情况下建立索引,各自的消耗。...2、先插数据,再建立两个索引,create table xxx as select * from t where 11;大约13秒,建立两个索引大约26秒和35秒。...总结: 如果先建立索引再插入数据,每次插入数据还需要修改索引信息。 实战还要看业务要求,有的业务可能还需要索引和约束对数据进行校验,这样就应该先建立索引了。...如果是一次性处理,原则先插数据后索引

2.7K30

MySQL分区表

在最近的项目中,我们需要保存大量的数据,而且这些数据是有有效期的,为了提供查询效率以及快速删除过期数据,我们选择了MySQL的分区机制。把数据按照时间进行分区。...分区表 新增分区 alter table access_log add partition( partition p4 values less than (to_days('20190105')...reorganize partition s0,s1 into ( partition p4 values less than (to_days('20190105')) ); 注意事项 MySQL...需要扫描所有分区) 分区字段不能为NULL,要不然怎么确定分区范围呢,所以尽量NOT NULL 最大分区数目不能超过1024 不支持外键 只能对数据表的整型列进行分区,或者数据列可以通过分区函数转化成整型列 分区表不影响自增列...· 最佳实践 · 分区表基本类型 互联网公司为啥不使用mysql分区表?

4.9K43

从根儿理解MySQL索引

准备工作为了更好地解释索引,我们先个表。...图片对应到存储结构那就是下图:图片按照上图,我们又添加了一个数据页99,用来保存页32和页124对应的2条目录,现在要查找主键ID为14的记录,需要经历这几个步骤:就从页99中,快速检索到对应的目录项数据页...没错,上面我们一步步推导出来的搜索结构就是大名鼎鼎的B+树,而MySQL给它起了一个更响亮的名字——索引。...其实在创建表的时候我们可以对字符串字段指定字符集和比较规则,如果你不指定,MySQL会默认给你设置,总之,MySQL总会找到一个方式对字符串进行排序。...除此之外,还提供了其他的索引方式,例如我的TablePlus工具(MacMySQL连接工具)提供了4种。

44371

mysql8分区表_MySQL 分区表

MySQL分区就是将一个表分解为多个更小的表。从逻辑讲,只有一个表或一个索引,但在物理上这个表或者索引可能由多个物理分区组成。每个分区在物理上都是独立的。...子分区(复合分区):MySQL数据库允许在Range和List的分区再进行Hash或者Key的子分区。 不论创建何种类型的分区,如果表中存在主键或唯一索引时,分区列必须是唯一索引的一个组成部分。...分区表会在磁盘上为每个分区创建一个文件,如下:# ls -lh t_range* -rw-r—– 1 mysql mysql 8.4K 8月 17 19:25 t_range.frm -rw-r—– 1...子分区 子分区是在分区的基础再进行分区,也称复合分区。MySQL允许在Range和List的分区再进行Hash或Key的子分区。...如果在分区表的任何分区使用subpartition来明确定义任何子分区,那么就必须定义所有的子分区。 可以使用subpartitions只指定子分区的数量,MySQL会自动为每个子分区分配名称。

2.6K10

MySQL分区表

MySQL实现分区表的方式——对底层表的封装。索引也是按照分区的子表定义的,而没有全局索引MySQL在创建表时使用PARTITION BY子句定义每个分区存放的数据。...一个表最多只能有1024个分区(MySQL5.6之后支持8192个分区)。 在MySQL 5.1中,分区表达式必须是整数,或者是返回整数的表达式。...在MySQL 5.5中,某些场景中可以直接使用列来进行分区。 如果分区字段中有主键或者唯一索引的列,那么所有主键列和唯一索引列都必须包含进来。 分区表中无法使用外键约束。...分区表的数据可以分布在不同的物理设备,从而高效地利用多个硬件设备。 可以使用分区表来避免某些特殊的瓶颈,例如InnoDB的单个索引的互斥访问 、ext3文件系统的inode锁竞争等。...这个加锁和解锁过程与普通InnoDB的查询类似 使用方法 MySQL支持多种分区表。我们看到最多的是根据范围进行分区,每个分区存储落在某个范围的记录,分区表达式可以是列,也可以是包含列的表达式。

4.4K41

好文 | MySQL 索引B+树原理,以及索引的几大原则

来源:小宝鸽 blog.csdn.net/u013142781/article/details/51706790 MySQL事实使用不同的存储引擎也是有很大区别的,下面猿友们可以了解一下。...在 MySQL 中,主要有四种类型的索引,分别为:B-Tree 索引, Hash 索引, Fulltext 索引和 R-Tree 索引。...不仅仅在 MySQL 中是如此,实际在其他的很多数据库管理系统中B-Tree 索引也同样是作为最主要的索引类型,这主要是因为 B-Tree 索引的存储结构在数据库的数据检索中有非常优异的表现。...如 Innodb 存储引擎的 B-Tree 索引实际使用的存储结构实际是 B+Tree,也就是在 B-Tree 数据结构的基础做了很小的改造,在每一个Leaf Node 上面出了存放索引键的相关信息之外...四、索引的几大原则 1、最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、 3

1K10

用好 mysql 分区表

为了保证MySQL的性能,我们都建议mysql单表不要太大,也经常有人问我这样的问题,整体来说呢,建议是:单表小于2G,记录数小于1千万,十库百表。...本文主要介绍几种分区的选型建议和语法,其实影响分区性能最重要的一点还有索引的设计,非常关键,如果索引没设计好,可能分区表的性能并不理想,后续单独整理分享。...按分区字段的范围查询 这里不得不吐槽一下,有的人,每天把数据往一个统计表里面存,不做分区,也不做历史数据淘汰,等到了300G,甚至1T以后,数据出不来,火急火燎的跑过来问题要怎么删除历史数据,而且表连一个主键、索引都没有...PARTITIONING ; 删除分区:ALTER TABLE tablename DROP PARTITIONING ; 移除分区仅仅修改表分区定义,数据不会被删除;删除分区会删除分区定义同时删除分区的数据...更多分区管理:(增删修改) https://dev.mysql.com/doc/refman/5.7/en/partitioning-management.html 分区表sql操作优化器如何选择: https

10.4K21

MySQL】分区字段列是否有必要再单独索引

对于分区字段必须是主键的一部分,那么建了复合主键之后,是否需要对分许字段再单独添加一个索引呢?有没有效果?...idx_ctime 5、分析添加索引后的执行计划 结果为: id select_type table partitions tpye possible_keys key key_len ref rows...分了区,只能说该字段为某个值的记录会在某个分区里面,但不是索引,还要一顿好找。 有时候,主键不等于分区依据列,这时候主键又想聚集索引的话,那么必须包含分区依据列,搞成复合主键。...那么,这种情况下,分区依据列不就有索引了吗?...是的,可是它不够快,如果在这个复合索引里面,分区依据列不排在第一位,就不够快,如果查找语句里常常用分区依据列作为过滤条件,就有必要为分区依据列额外单独建立一个索引

2.5K30

mysql分区表_MySQL分区表的正确使用方法

MySQL分区表概述 我们经常遇到一张表里面保存了上亿甚至过十亿的记录,这些表里面保存了大量的历史记录。 对于这些历史数据的清理是一个非常头疼事情,由于所有的数据都一个普通的表里。...面对这类问题,最有效的方法就是在使用分区表。最常见的分区方法就是按照时间进行分区。 分区一个最大的优点就是可以非常高效的进行历史数据的清理。 1....确认MySQL服务器是否支持分区表 命令: show plugins; 2....MySQL分区表的特点 在逻辑为一个表,在物理上存储在多个文件中 HASH分区(HASH) HASH分区的特点 根据MOD(分区键,分区数)的值把数据行存储到表的不同分区中 数据可以平均的分布在各个分区中...HASH分区的键值必须是一个INT类型的值,或是通过函数可以转为INT类型 如何建立HASH分区表 以INT类型字段 customer_id为分区键 CREATE TABLE `customer_login_log

3.1K20
领券