索引的使用

索引是一种数据结构,用于快速查找数据库中的数据。索引可以加快查询的速度,并减少数据库的负载和响应时间。以下是使用索引的一些方法:

1.创建索引 :可以通过CREATE INDEX语句创建索引。在创建索引时,需要指定要创建索引的表及其列。

例如:在"my_table"的表的"my_column"列上创建索引的SQL语句:

CREATE INDEX my_index ON my_table (my_column);

创建复合索引:

例如,我们要在名为employee的表中创建一个名为aaa的复合索引,包含age和salary两列,可以使用以下语句:

CREATE INDEX aaa ON employee (age, salary);

请注意,创建索引会增加存储需求,并且会影响INSERT、UPDATE和DELETE操作的性能。因此,需要仔细考虑哪些列需要索引,以及它们的顺序和其他属性。

2.删除索引 :要删除MySQL索引,需要使用ALTER TABLE语句,使用DROP INDEX子句指定要删除的索引名称。

例如:将"mytable"的表,删除一个名为"myindex"的索引,可以使用以下命令:

ALTER TABLE mytable DROP INDEX myindex;

3.选择正确的列:为了更好地利用索引,应该选择一些常常被查询的列来创建索引。

4.使用复合索引:一个表中的数据在查询时有多个字段总是同时出现,这些字段就可以组合成复合索引。复合索引是由多个列组成的索引,在数据库查询时,可以同时使用这些列来进行查找和排序。复合索引可以提高查询效率,减少数据库的读取次数和磁盘的访问量。当查询条件中有多个列的时候,使用复合索引可以更快地定位到正确的数据行。

复合索引的使用也需要考虑到以下几点:
索引的列顺序要考虑到查询时的条件,通常会把使用最频繁的列放在前面

索引列的选择要尽量覆盖查询条件,避免使用到没有建索引的列。

复合索引的建立也需要考虑到索引的数量,如果索引过多会对数据库的性能造成影响。

复合索引也要定期进行优化和维护,避免出现失效的情况。

5.避免使用过多的索引:使用过多的索引会影响性能,因此应该避免创建过多的索引。

6.定期维护索引:定期维护索引可以确保其性能和可用性。

7.在使用索引时需要注意以下几点

1、索引需要耗费额外的存储空间,因此需要权衡存储空间和查询效率。

2、索引需要在数据插入、更新、删除时进行维护,因此会增加写入操作的时间开销。

3、对于一些数据量较小的表,索引可能会影响查询效率。

4、需要根据具体的查询需求建立合适的索引,建立不必要的索引会浪费存储空间。

8、索引失效:是指在数据库中创建的索引无法被有效使用,导致查询或操作的执行效率下降。这种情况可能会出现在以下情况中:

  1. 数据库中的数据发生了变化,例如数据被插入、更新或删除,导致索引中的数据不再正确地反映实际数据。

  2. 查询语句中的条件不利于索引的使用,例如使用了不等于、or运算符、函数(如DATE(),UPPER()等)等操作,那么数据库系统就无法将这些函数和索引进行匹配,从而无法使用索引。

  3. 数据库表中数据分布不均:如果表中数据不均匀分布,索引就可能失去效果。例如,一张顾客信息表中,大部分顾客都是来自东部地区,少部分是来自西部地区,如果按照地区名称建立索引,那么查询"来自东部地区的顾客"时索引就无法发挥作用,因为大部分数据都是"东部地区",查询时需要扫描大量数据。

  4. 数据表中的数据量太大:如果表中数据量太大,索引就会失效。当索引的选择性(即不重复的索引值和表中记录总数的比率)很低时,使用索引就不如全表扫描快。

数据表中的缺陷:如果数据表中的数据存在缺陷,如数据冗余、数据类型不匹配等问题,就可能导致索引失效。

为了避免索引失效的情况,可以采取以下措施:

  1. 定期维护索引,包括优化索引结构、重建索引、统计索引信息等。
  2. 合理的设计查询语句,避免使用不利于使用索引的操作符和函数。
  3. 避免在数据库中存储大量重复的数据,如可以通过引入外键来进行关联,以优化索引使用效率。
  4. 针对数据量大的情况,可以考虑采用分库分表的方式来减少索引需要占用的空间和操作所需的资源。

通常来说,对于需要频繁进行查询的列或者经常作为查询条件的列,可以考虑建立索引。建立索引可以使用CREATE INDEX语句,删除索引可以使用DROP INDEX语句,查询优化器会自动使用合适的索引。

补充一个:最左原则: (这个是关于复合索引的)

譬如在表aaa中建立复合索引(column_1, column_2, column_3)

select * from aaa where column_2='a'

select * from aaa where column_3='a'

select * from aaa where column_2='a' and column_3='a'

这些都没有用到索引进行查询,用的是全表查询,查询的时候如果where条件没有最左边一列或者多列,索引就不会起作用

select * from aaa where column_1='a' and column_3='a'

只用到了column_1的索引,column_3的索引没有用到,因为column_1, column_2, column_3是连续索引,只有三个是连续的时候才是引用了整个复合索引

即:select * from aaa where column_1='a' and column_2='a' and column_3='a'

再如使用了不等号,or,或者函数

select * from aaa where column_1='a' and column_2 < 3 and column_3='a'

select * from aaa where column_1='a' and column_2 = 3 or column_3='a'

select * from aaa where column_1='a' and column_2 = DATE('xxx') and column_3='a'

只会用到column_1, column_2,的索引,column_3的索引使用不到

强制使用索引a:select * from t force index(a) where a > 1

相关推荐
Zzz 小生1 小时前
Claude Code学习笔记(四)-助你快速搭建首个Python项目
大数据·数据库·elasticsearch
nongcunqq4 小时前
abap 操作 excel
java·数据库·excel
rain bye bye5 小时前
calibre LVS 跑不起来 就将setup 的LVS Option connect下的 connect all nets by name 打开。
服务器·数据库·lvs
冻咸鱼5 小时前
MySQL的配置
mysql·配置
阿里云大数据AI技术6 小时前
云栖实录|MaxCompute全新升级:AI时代的原生数据仓库
大数据·数据库·云原生
不剪发的Tony老师7 小时前
Valentina Studio:一款跨平台的数据库管理工具
数据库·sql
重生之我要当java大帝7 小时前
java微服务-尚医通-编写医院设置接口下
java·开发语言·sql
weixin_307779137 小时前
在 Microsoft Azure 上部署 ClickHouse 数据仓库:托管服务与自行部署的全面指南
开发语言·数据库·数据仓库·云计算·azure
六元七角八分7 小时前
pom.xml
xml·数据库
虚行7 小时前
Mysql 数据同步中间件 对比
数据库·mysql·中间件