一般在数据中,很多朋友很喜欢用索引来对数据库优化。通过索引通常可以帮助我们解决大多数的SQL性能问题。
1. 索引的存储分类
MyISAM存储引擎的表的数据和索引时自动分开存储的,各自是独立的一个文件;InnoDB存储引擎的表的数据和索引时存储在同一表空间里面,但可以有多个文件组成。
MySQL中索引的存储类型目前只有两种(BTREE和HASH),具体和表的存储引擎相关;MyISAM和InnoDB存储引擎都只支持BTREE索引;MEMORY/HEAP存储引擎可以支持HASH和BTREE索引。
MySQL目前不支持函数索引,但是能对列的前面某一部分进行索引,例如name字段,可以以只取name的前4个字符进行索引,这个特征可以大大缩小索引文件的大小。在设计表结构的时候也可以对文本列根据此特性进行灵活设计。例如
引用
create index ind_company2_name on company2(name(4))
2. MySQL如何使用索引
索引用于快速找出在某个列中有一特定值的行。对相关列使用索引时提高SELECT操作性能的最佳途径。
查询要使用索引最主要的条件是查询条件中需要使用索引关键字,如果是多列索引,那么只有查询条件使用了多列关键字最左边的前缀时,才可以使用索引,否则将不能使用索引。
1. 使用索引
在MySQL中,下列几种情况下可能使用索引。
对于创建的多列索引,只要查询的条件中用到了最左边的列,索引一般就会使用。
例如:
引用
我们首先按company_id ,Moneys的顺序创建一个复合索引
create index ind_sales2_companyid_moneys on sales2(company_id,moneys)
如果按company_id进行表查询
引用
使用explain来分析下
explain select * from sales2 where company_id =2000 \G;
explain select * from sales2 where moneys = 1\G;
通过上面你可以发现即便where条件中不是用company_id 和 moneys的组合条件,索引仍然能用到,这就是索引的前缀特性。但是如果只按照moneys条件查询表,那么索引就不会被用到。
对于使用like的查询,后面如果是常量并且只有%号不在第一字符,索引才能会被使用例如
引用
explain select * from company2 where name like "%3"\G;
explain select * from company2 where name like "3%"\G;
以上两句你可以认为是一样的。其实是不一样的。第一句其实没有用到索引,而第二句才能够利用到索引。另外如果like后面跟的是一个列的名字,那么索引也不会被使用。
如果对大是文本进行搜索,使用全文索引而不用使用like"%..%"
如果列名是索引,使用column_name is null 将使用索引如
查询name为nll的记录就用到了索引
引用
explain select * from company2 where name is null \G;
2. 下面一些情况存在索引但不使用索引,你可能认为它会用,但是实际上它就是没用。
引用
1. 如果Mysql估计使用索引比全表扫描更慢,则不使用索引。
例如列key_part1均匀分布在1和100之间,下列查询中使用索引就不是很好
select * from table_name where key_part1 > 1 and key_part1 < 90;
2. 如果使用MEMORY/HEAP表并且where条件中不使用"="进行索引列,那么不会用到索引。heap表只有在" ="的条件下才会使用索引
3. 用or分割开的条件,如果or前的条件中的列有索引,而后面的列中没用索引,那么涉及的索引都不会被用到
4. 如果不是索引列的第一部分,那么也不会使用。
5. 如果like是以"%"开始
6. 如果列类型是字符串,那么一定记得在where条件中把字符常量值用引号引起来,否则即便这个列上有索引,Mysql也不会使用。因为MYSQL默认把输入的常量值进行转换以后才进行检索。
最后查看索引使用情况
如果索引正在工作,Handler_read_key的值将很高,这个值代表了一个行被索引值读的次数,很低的值表明增加索引得到的性能改善不高,因为索引经常不被使用到。Handler_read_rnd_next的值高则说明查询运行低效,并且应该建立索引补救。这个值的含义是在数据文件中读取下一行的请求数。如果正进行大量的表扫描,Handler_read_rnd_next的值较高,则通常说明表索引不正确或者写入的查询没有利用索引。
还记得怎么看Handler_read_rnd_next 吗?
使用show statuts like 'Handler_read_%';
分享到:
相关推荐
使用SQL优化工具时,要注意结合实际业务场景和数据库架构,避免盲目优化导致的副作用,如过度依赖索引可能导致插入和更新操作变慢,或者内存消耗增加。同时,优化过程中应遵循最佳实践,比如合理设计数据库模式、...
"SQL优化-索引10.htm"可能涉及了索引在并发操作中的影响,如锁定和行版本控制,以及如何在高并发环境中优化索引策略,以减少锁争用和提高系统并发性能。 综上所述,这个压缩包文件提供了全面的SQL Server索引优化...
在数据库管理领域,SQL性能优化和索引优化是至关重要的技术环节,它们直接影响到数据库的运行效率和用户...通过深入学习和实践《SQL性能优化.doc》和《SQL优化-索引.doc》中的内容,你可以更深入地理解和掌握这些技术。
sqlserver管理索引优化SQL语句
### 数据库面试题索引SQL优化 ...通过以上的分析和讨论,我们不仅深入了解了数据库面试中常见的SQL优化和索引相关的问题,还学习了一些实用的优化技巧。这些知识点对于提高数据库应用的性能至关重要。
在SQL Server 2000中,索引是数据库性能优化的关键组成部分,它极大地影响了数据查询的速度。本文将深入探讨SQL Server 2000中的索引优化,旨在帮助数据库管理员和开发人员理解如何有效地利用索引来提升系统性能。 ...
提高索引的存储效率可以通过选择合适的索引类型、优化索引的结构、减少二次查找等方法来实现。减少维护的开销可以通过合适的索引数量、减少索引的更新频率、使用压缩技术等方法来实现。 索引的类型包括聚集索引和非...
SQL优化中的索引是提升数据库查询性能的关键技术。索引可以理解为数据库中的一种特殊目录,帮助快速定位和访问数据。SQL Server提供了两种主要类型的索引:聚集索引(Clustered Index)和非聚集索引(Nonclustered ...
### Oracle SQL优化与索引提示应用案例解析 在Oracle数据库管理与优化的实践中,SQL语句的执行效率直接影响着系统的响应速度与资源消耗。当面对复杂的查询或批量更新操作时,合理利用索引提示(Index Hint)成为...
【SQL优化-索引】是数据库管理中至关重要的一个环节,尤其在Microsoft SQL Server中,索引分为聚集索引(Clustered Index)和非聚集索引(Nonclustered Index)两种类型。 聚集索引,就像汉语字典的正文,按照特定...
SqlServer性能优化是数据库管理员和开发人员必须面对的常见任务,而高效索引则是提升SqlServer数据库性能的关键手段之一。索引是数据库表中的一种数据结构,用于加速查询操作,尤其是那些涉及WHERE子句、JOIN操作和...
本文将深入探讨数据库面试中的常见问题,特别是关于SQL优化和针对大规模数据库的优化策略。首先,我们来看看"数据库面试题索引sql优化.pdf"可能涵盖的内容。 1. **SQL基础与语法**:面试通常会涉及到SQL的基本概念...
在SQL世界中,优化是确保数据库高效运行的关键环节,尤其是对于处理大量数据的企业级应用而言。本主题聚焦于“SQL优化-索引”...在实际工作中,应结合业务需求和性能监控,持续优化索引策略,以实现最优的数据库性能。
深入理解SqlServer索引机制及合理优化数据库
一、数据库SQL优化之索引优化 1. 在where及order by涉及的列上建立索引,以避免全表扫描。 二、数据库SQL优化之避免NULL值 2. 尽量避免在where子句中对字段进行NULL值判断,以免引擎放弃使用索引而进行全表扫描。...
本文将深入探讨Oracle索引的原理、创建方法,并结合SQL优化策略,帮助你提升数据库查询速度,降低资源消耗。 首先,我们要理解索引的基本概念。在数据库中,索引类似于书籍的目录,它为数据提供快速访问的途径。...
### SQL优化、索引的建立和运用以及多表连接建索引的相关知识点 #### SQL优化概述 在数据库系统中,SQL语句的执行效率对于系统的响应时间和资源利用有着至关重要的影响。合理的SQL优化不仅可以显著提升查询速度,还...
其中,优化数据库索引的使用是提高 SQL Server 性能的关键因素之一。在本文中,我们将讨论如何用 SQL Server 的工具来优化数据库索引的使用,并涉及到有关索引的一般性知识。 索引的类型主要有两种:clustered 索引...
千万级数据sql优化_索引,大概从12个角度层次阐述哪些可以通过索引进行优化,哪些关键词会影响到索引的使用