当前位置:网站首页>MySQL数据库创建索引的方法和好处
MySQL数据库创建索引的方法和好处
2022-06-11 13:48:00 【zhangsan3333】
mysql 查询速度_为什么 MySQL 添加索引能提高查询速度?
MySQL 索引
MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。
打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。
拿汉语字典的目录页(索引)打比方,我们可以按拼音、笔画、偏旁部首等排序的目录(索引)快速查找到需要的字。
索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。
创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。
实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。
上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。
建立索引会占用磁盘空间的索引文件。
Mysql哪些字段适合建立索引
工作中处理数据时,发现某个表的数据达近亿条,所以要为表建索引提高查询性能,以下两篇文章总结的很好,记录一下,以备后用。
数据库建立索引常用的规则如下:
- 1、表的主键、外键必须有索引;
- 2、数据量超过300的表应该有索引;
- 3、经常与其他表进行连接的表,在连接字段上应该建立索引;
- 4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
- 5、索引应该建在选择性高的字段上;
- 6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;
- 7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:
A、正确选择复合索引中的主列字段,一般是选择性较好的字段;
B、复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引;
C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;
E、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引; - 8、频繁进行数据操作的表,不要建立太多的索引;
- 9、删除无用的索引,避免对执行计划造成负面影响;
以上是一些普遍的建立索引时的判断依据。
索引的建立必须慎重,对每个索引的必要性都应该经过仔细分析,要有建立的依据。
因为太多的索引与不充分、不正确的索引对性能都毫无益处:在表上建立的每个索引都会增加存储开销,索引对于插入、删除、更新操作也会增加处理上的开销。 另外,过多的复合索引,在有单字段索引的情况下,一般都是没有存在价值的;相反,还会降低数据增加删除时的性能,特别是对频繁更新的表来说,负面影响更大。
总的来说,小型表肯定不建索引,
或者数据库记录在亿条数据级以上,还是建议使用非关系型数据库。
还有些特殊字段的数据库,比如BLOB,CLOB字段肯定也不适合建索引。
其实这个问题更感觉偏向于做软件项目的一种经验。
对千万级MySQL数据库建立索引的事项及提高性能的手段
一、注意事项:
首先,应当考虑表空间和磁盘空间是否足够。我们知道索引也是一种数据,在建立索引的时候势必也会占用大量表空间。因此在对一大表建立索引的时候首先应当考虑的是空间容量问题。
其次,在对建立索引的时候要对表进行加锁,因此应当注意操作在业务空闲的时候进行。
二、性能调整方面:
首当其冲的考虑因素便是磁盘I/O。物理上,应当尽量把索引与数据分散到不同的磁盘上(不考虑阵列的情况)。逻辑上,数据表空间与索引表空间分开。这是在建索引时应当遵守的基本准则。
其次,我们知道,在建立索引的时候要对表进行全表的扫描工作,因此,应当考虑调大初始化参数db_file_multiblock_read_count的值。一般设置为32或更大。
再次,建立索引除了要进行全表扫描外同时还要对数据进行大量的排序操作,因此,应当调整排序区的大小。
9i之前,可以在session级别上加大sort_area_size的大小,比如设置为100m或者更大。
9i以后,如果初始化参数workarea_size_policy的值为TRUE,则排序区从pga_aggregate_target里自动分配获得。
最后,建立索引的时候,可以加上nologging选项。以减少在建立索引过程中产生的大量redo,从而提高执行的速度。
MySql在建立索引优化时需要注意的问题
设计好MySql的索引可以让你的数据库飞起来,大大的提高数据库效率。设计MySql索引的时候有以下几点注意:
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 “%a%” 不会使用索引而like “aaa%”可以使用索引。
7,不要在列上进行运算
select * from users where YEAR(adddate)
8,不使用NOT IN和操作
NOT IN操作不会使用索引将进行全表扫描。NOT IN可以NOT EXISTS代替
边栏推荐
- SAP Spartacus checkout 流程使用 url 粘贴直接跳转到 delivery mode不能打开页面的原因
- tf.data(二) —— 并行化 tf.data.Dataset 生成器
- [the path of system analyst] collection of wrong topics of system analyst
- Introduction to reverse learning - excellent assembly debugging tool OllyDbg
- Microsoft exposes another "scandal": watching VR porn in the office, "the father of hololens" is about to leave!
- 如何写出高性能代码(四)优化数据访问
- SQL: how to use the data of purchase order and sales order to calculate commodity cost by moving weighted average method
- C language learning record 6
- Jdbctemplate data background management. I don't know why roleid is empty when adding users
- 优化调度(火电、风、储能)(Matlab实现)
猜你喜欢
![[signal de-noising] chromatographic baseline estimation and de-noising based on sparsity (beads) with matlab code and papers](/img/7f/8ffc83e5717275b27f1fd34111ca15.png)
[signal de-noising] chromatographic baseline estimation and de-noising based on sparsity (beads) with matlab code and papers

如何写出高性能代码(四)优化数据访问

基于FPGA的VGA协议实现

利用 VSCode 的代码模板提高 MobX 的编码效率

BS-XX-007基于JSP实现户籍管理系统

Introduction to common fonts

Chip engineers are too expensive? Your sister

Two small things, feel the gap with the great God

Three level classification display

How about NFT market? Why is NFT so popular? How to build NFT platform
随机推荐
Terraformer importing cloud resources
Can't understand kotlin source code? Starting with the contracts function~
D interval to nullable conversion
Unity detects whether the object is within the viewing cone of the camera
风电随机性动态经济调度模型(Matlab代码实现)
What do you need to do to "surpass" the general database in the time sequence scenario?
Introduction to common fonts
Question bank and answers for 2022 tool fitter (intermediate) operation certificate examination
Setting tcp/ip network in Debian
看不懂Kotlin源码?从Contracts 函数说起~
Energy storage operation and configuration analysis of high proportion wind power system (realized by Matlab)
Application choreography nomad vs. kubernetes
C language learning record 6
程序员到了35岁之后的一些转型思考
Interview to build an aircraft carrier, screw on the job, pay
Teatalk · online speech record | complete! It is important to select the right data migration strategy for safe cloud deployment
From real-time computing to streaming data warehouse, where will Flink go next?
How to manage the server to make the website stable and smooth
Introduction to reverse learning - excellent assembly debugging tool OllyDbg
AGV robot RFID sensor ck-g06a and Siemens 1200plc Application Manual