深入分析mysql索引何时创建比较好

索引可以提高数据的检索效率,也可以降低数据库的IO成本,并且索引还可以降低数据库的排序成本。排序分组操作主要消耗的就是CPU资源和内存,所以能够在排序分组操作中好好的利用索引将会极大地降低CPU资源的消耗。本篇文章将简单的分析一下如何正确创建MySQL数据索引。

如何判定是否需要创建索引?

1、较频繁地作为查询条件的字段

这个都知道。什么是教频繁呢?分析你执行的所有SQL语句。最好将他们一个个都列出来。然后分析,发现其中有些字段在大部分的SQL语句查询时候都会用到,那么就果断为他建立索引。

2、唯一性太差的字段不适合建立索引

什么是唯一性太差的字段。如状态字段、类型字段。那些只存储固定几个值的字段,例如用户登录状态、消息的status等。这个涉及到了索引扫描的特性。例如:通过索引查找键值为A和B的某些数据,通过A找到某条相符合的数据,这条数据在X页上面,然后继续扫描,又发现符合A的数据出现在了Y页上面,那么存储引擎就会丢弃X页面的数据,然后存储Y页面上的数据,一直到查找完所有对应A的数据,然后查找B字段,发现X页面上面又有对应B字段的数据,那么他就会再次扫描X页面,等于X页面就会被扫描2次甚至多次。以此类推,所以同一个数据页可能会被多次重复的读取,丢弃,在读取,这无疑给存储引擎极大地增加了IO的负担。

3、更新太频繁地字段不适合创建索引

当你为这个字段创建索引时候,当你再次更新这个字段数据时,数据库会自动更新他的索引,所以当这个字段更新太频繁地时候那么就是不断的更新索引,性能的影响可想而知。大概被检索几十次会更新一次的字段才比较符合建立索引的规范。而如果一个字段同一个时间段内被更新多次,那么果断不能为他建立索引。

4、不会出现在where条件中的字段不该建立索引

注意:

并非所有的数据库都以相同的方式使用索引。作为通用规则,只有当经常查询索引列中的数据时,才需要在表上创建索引。索引占用磁盘空间,并且降低添加、删除和更新行的速度。在多数情况下,索引用于数据检索的速度优势大大超过它的不足之处。但是,如果应用程序非常频繁地更新数据或磁盘空间有限,则可能需要限制索引的数量。

可以基于数据库表中的单列或多列创建索引。多列索引使您可以区分其中一列可能有相同值的行。

如果经常同时搜索两列或多列或按两列或多列排序时,索引也很有帮助。例如,如果经常在同一查询中为姓和名两列设置判据,那么在这两列上创建多列索引将很有意义。

确定索引的有效性:

● 检查查询的 WHERE 和 JOIN 子句。在任一子句中包括的每一列都是索引可以选择的对象。

● 对新索引进行试验以检查它对运行查询性能的影响。

● 考虑已在表上创建的索引数量。最好避免在单个表上有很多索引。

● 检查已在表上创建的索引的定义。最好避免包含共享列的重叠索引。

● 检查某列中唯一数据值的数量,并将该数量与表中的行数进行比较。比较的结果就是该列的可选择性,这有助于确定该列是否适合建立索引,如果适合,确定索引的类型。

MySQL何时使用索引

对一个键码使用>, >=, =, <, <=, IF NULL和BETWEEN

SELECT * FROM table_name WHERE key_part1=1 and key_part2 > 5;
SELECT * FROM table_name WHERE key_part1 IS NULL;
当使用不以通配符开始的LIKE

SELECT * FROM table_name WHERE key_part1 LIKE 'jani%'
在进行联结时从另一个表中提取行时

SELECT * from t1,t2 where t1.col=t2.key_part
找出指定索引的MAX()或MIN()值

SELECT MIN(key_part2),MAX(key_part2) FROM table_name where key_part1=10
一个键码的前缀使用ORDER BY或GROUP BY

SELECT * FROM foo ORDER BY key_part1,key_part2,key_part3
在所有用在查询中的列是键码的一部分时间

SELECT key_part3 FROM table_name WHERE key_part1=1

MySQL何时不使用索引

如果MySQL能估计出它将可能比扫描整张表还要快时,则不使用索引。例如如果key_part1均匀分布在1和100之间,下列查询中使用索引就不是很好:

SELECT * FROM table_name where key_part1 > 1 and key_part1 < 90
如果使用HEAP表且不用=搜索所有键码部分。

在HEAP表上使用ORDER BY。

如果不是用键码第一部分

SELECT * FROM table_name WHERE key_part2=1
如果使用以一个通配符开始的LIKE

SELECT * FROM table_name WHERE key_part1 LIKE '%jani%'
搜索一个索引而在另一个索引上做ORDER BY

SELECT * from table_name WHERE key_part1 = # ORDER BY key2

建立MySql数据库索引需要注意的几个问题

1.建立索引的时机:若表中的某字段出现在select、过滤、排序条件中,为该字段建立索引是值得的。
2.对于like %xxx的模糊查询,普通的索引是无法满足的,需要建立全文索引。
3.对于有多个条件的,比如: "...where a=xx and b=yy","...where a=xx order by b","...where a=xx group by b"。需要使用组合索引。但是组合索引只能在SQL语句中满足"最左前缀"的条件下使用。且组合索引有一些副作用,如索引尺寸可能比数据本身大,因为组合索引的组合条目多。所以在实际应用中,要量身定做,使用慢查询分析工具分析。
4.开启索引缓存,直接在内存中查找索引,不用再磁盘中。
5.建立索引是有代价的,当update、delete语句执行时,会使得索引更新,将耗掉更多的时间。可以使用mysqlreport报告,了解select、update、delete、insert、replace各语句所占的百分比.

时间: 2024-09-29 02:56:19

深入分析mysql索引何时创建比较好的相关文章

深入分析MySQL索引结构原理、性能分析与优化详解

第一部分:基础知识: 索引 官方介绍索引是帮助MySQL高效获取数据的数据结构.笔者理解索引相当于一本书的目录,通过目录就知道要的资料在哪里,不用一页一页查阅找出需要的资料.关键字index --------------------- 唯一索引 强调唯一,就是索引值必须唯一,关键字unique index 创建索引: 1.create unique index 索引名 on 表名(列名); 2.alter table 表名 add unique index 索引名 (列名); 删除索引: 1.

深入分析MySQL数据库索引

什么是索引 索引是存储引擎用于快速找到记录的一种数据结构,索引类似一本书的目录,我们根据目录可以快速的查找到我们感兴趣的内容.索引就是存储引擎的目录,如果没有索引存储引擎必须遍历整个数据库表来查询符合条件的记录,索引的建立和优化应该是提升查询性能最有效的手段了. 索引的类型 索引是在MYSQL的存储引擎层中实现的,而不是在服务层实现的.所以每种存储引擎的索引都不一定完全相同,也不是所有的存储引擎都支持所有的索引类型.即使多个存储引擎支持同一种类型的索引,其底层实现也可能不同. B-Tree索引

详解mysql索引总结----mysql索引类型以及创建_Mysql

关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车.对于没有索引的表,单表查询可能几十万数据就是瓶颈,而通常大型网站单日就可能会产生几十万甚至几百万的数据,没有索引查询会变的非常缓慢.还是以WordPress来说,其多个数据表都会对经常被查询的字段添加索引,比如wp_comments表中针对5个字段设计了BTREE索引.  一个简单的对比测试 以我去年测试的数据作为一个简单示例,20多条数据源随机生成200万

MySQL查看、创建和删除索引的方法_Mysql

本文实例讲述了MySQL查看.创建和删除索引的方法.分享给大家供大家参考.具体如下: 1.索引作用 在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技术,能够大大提高查询效率.特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍. 例如,有3个未索引的表t1.t2.t3,分别只包含列c1.c2.c3,每个表分别含有1000行数据组成,指为1-1000的数值,查找对应值相等行的查询如下所示. SELECT c1,c2,c3 FROM t1,t2,t3

MySQL索引操作命令(创建索引、重建索引、查询索引、删除索引)

1.创建索引 索引的创建可以在CREATE TABLE语句中进行,也可以单独用CREATE INDEX或ALTER TABLE来给表增加索引.以下命令语句分别展示了如何创建主键索引(PRIMARY KEY),联合索引(UNIQUE)和普通索引(INDEX)的方法. mysql>ALTER TABLE `table_name` ADD INDEX `index_name` (column list); mysql>ALTER TABLE `table_name` ADD UNIQUE `inde

MySQL索引类型以及创建

文章归属:http://feiyan.info/16.html 关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车.对于没有索引的表,单表查询可能几十万数据就是瓶颈,而通常大型网站单日就可能会产生几十万甚至几百万的数据,没有索引查询会变的非常缓慢.还是以WordPress来说,其多个数据表都会对经常被查询的字段添加索引,比如wp_comments表中针对5个字段设计了BTREE索引. 一个简单的对比测试 以我

使用MYSQL索引

    关系数据库的世界是一个表与集合.表与集合上的运算占统治地位的世界.数据库是一个表的集合,而表又是行和列的集合.在发布一条SELECT 查询从表中进行检索行时,得到另一个行和列的集合.这些都是一些抽象的概念,对于数据库系统用来操纵表中数据的基本表示没有多少参考价值.另一个抽象概念是,表上的运算都同时进行:查询是一种概念性的集合运算,并且集合论中没有时间概念.当然,现实世界是相当不同的.数据库管理系统实现了抽象的概念,但是在实际的硬件    范围内要受到实际的物理约束.结牵檠ㄊ奔洌

添加mysql索引的3条原则

一,索引的重要性 索引用于快速找出在某个列中有一特定值的行.不使用索引,MySQL必须从第1条记录开始然后读完整个表直到找出相关的行.表越大,花费的时间越多.如果表中查询的列有一个索引,MySQL能快速到达一个位置去搜寻到数据文件的中间,没有必要看所有数据.注意如果你需要访问大部分行,顺序读取要快得多,因为此时我们避免磁盘搜索. 假如你用新华字典来查找"张"这个汉字,不使用目录的话,你可能要从新华字典的第一页找到最后一页,可能要花二个小时.字典越厚呢,你花的时间就越多.现在你使用目录来

MySQL索引经验之浅见

mysql|索引 在数据库表中,使用索引可以大大提高查询速度. 假如我们创建了一个testIndex表:CREATE TABLE testIndex(i_testID INT NOT NULL,vc_Name VARCHAR(16) NOT NULL); 我们随机向里面插入了1000条记录,其中有一条    i_testID    vc_Name      555    erquan     在查找vc_Name="erquan"的记录SELECT * FROM testIndex W