各位大神们,请问oracle/mysql数据库创建索引的原则是什么?

了解数据库索引就像拥有一个快速搜索键。
MySQL或Oracle中的索引是一种将数据排序到表中的结构,其目的是加快检索信息的过程。
在设计数据库时,创建索引以及创建索引的类型将直接决定查询的效率。
索引列可以快速响应查询,而非索引列可能需要耗时的等待时间。
创建索引虽然可以提高查询速度,但也会占用额外的存储空间,影响数据修改的速度,消耗系统性能。
索引具有多种功能,包括:加速数据检索、确保数据唯一性、维护引用完整性以及改进GROUPBY和ORDERBY语句的查询处理。
并非所有列都需要建立索引。
一般来说,主键列、外键列、重复查询或连接中使用的列以及需要按排序顺序快速检索的列最适合作为索引目标。
设计索引时还必须考虑表更新性能、索引数量、索引宽度等因素。
创建大量索引会增加插入、更新和删除操作的延迟。
对于更新频繁的表,应注意不要创建太多索引,并确保索引宽度合适。
多个索引可以提高查询性能,尤其是在查询更新较少、数据量较大的小表时。
然而,在小表上创建索引可能不会带来显着的改进。

以MySQL为例我们来聊聊,索引创建原则和执行计划分析。

什么情况下需要创建索引?

主键自动创建唯一索引;

经常用作查询条件的字段必须建立索引;

查询中与其他字段关联的字段以及外键关系已索引;

频繁更新的字段不创建索引;

Where条件中未使用的字段不创建索引;构建索引;

选择唯一键/组合索引通常会在竞争激烈的情况下倾向于创建复合索引;

对于查询中的排序字段,如果可以通过以下方式访问排序字段建立索引,会显着提高排序速度;

查询时对字段进行统计或分组;

什么情况下不需要创建索引?

表中记录太少

频繁添加、删除、修改字段

创建索引虽然提高了查询速度,但也会降低查询表更新速度,像insert和updatetable的delete一样,因为当表更新的时候,MySQL不仅需要保存数据,还需要保存索引文件。

具有重复数据且均匀分布的表字段应该只为最常查询和最常排序的数据列创建索引。
如果一个数据列包含多个重复项,为其建立索引不会有太大的实际效果。

a.如果一个表包含10万条记录,并且字段A只有两个值:T和F,并且每个值的分布概率约为50%,则在该表的字段A上创建索引通常不会提高数据库查询速度。
b.索引选择性是指缩略图列中不同值的数量相对于表中记录的数量。
如果一个表中有2000条记录,表的索引列有1980个不同的值,那么这个索引的选择性就是1980/2000=0.99。
索引的选择性越接近1,索引的效率越高。

MySQL性能分析常见MySQL性能瓶颈

CPU:通常发生在CPU饱和时,数据加载到内存或从磁盘读取时

IO:加载数据时,发生磁盘I/O瓶颈数据远大于内存容量

服务器硬件性能瓶颈throttting:top、free、iostat、vmstat检查系统性能状态

MySQL执行计划

什么是执行计划?

使用EXPLAIN关键字可以模拟优化器对SQL查询语句的执行,从而了解MySQL如何处理你的SQL语句,分析你的语句查询或表结构的性能瓶颈。

执行计划能帮助我们完成什么任务?

a.读表顺序B.数据读取操作的类型c.可以使用哪些指标D.表f之间的引用是什么?该行被优化器查询

执行计划的CASE演示

案例分析

第一行(执行顺序4):列id为1,表示union第一个select,select_type主表表示查询是外部查询,表列标记为,表示结果查询来自派生表,其中derivative3中的3表示该查询派生自第三个select查询,即:select[selectd1.namewithid3...]

第二行(执行顺序是2):id是3,它是整个查询中第三个选择的一部分,因为包含查询。
在from中,它是派生的。
[selectid,namefromwhereother_column='']

第三行(执行顺序为3):select列表中的select_type子查询为子查询,是整个查询中的第二个select。
[selectidfromt3]

第四行(执行顺序为1):selectt_typeisunion,表示第四次选择是中的第二次选择unin和[selectname,idfromt2]先执行

第五行(执行顺序为5):从表示union的临时表中读取在该行步骤中,表列中的表示第一和第四选择结果用于并集运算。
[两个结果的并集运算]