python技术面试题(十四)--数据库索引

简介: python技术面试题(十四)--数据库索引

每日分享

You raise me up,so I can stand on mountains .You raise me up,to walk on stormy seas.

你激励了我故我能立足于群山之巅。你鼓舞了我,故我能行进于暴风雨的洋面。

小闫语录

激励能激发一个人的潜力,激励能抚慰一颗受伤的心,激励能鼓起失去的勇气。所以,正在看这篇文章的你,请开心每一天。得不到的是配不上你的,即将得到的一定是更好的。


MySQL数据库索引

数据库索引是什么大家应该都已经知道。为什么建立索引,大家应该张口就来。算了,我还是简简单单的说一下吧:

数据库索引可以理解为数据库中一种排序的数据结构。它的存在就是为了协助快速查询、更新数据库表中的数据。优化查询效率。(简直和废话一样,谁不知道索引就像新华字典前面的音节索引和部首检字表一样......)

那么索引的原理呢?什么时候创建索引呢?索引有哪些呢?这些你想过吗?不知道就对了,我也不知道(会不会被打死....)。

MySQL中的索引用到了B+树、哈希桶等索引数据结构,但是主流还是B+树。那么为什么B+树适合做数据库索引呢?

1.B+树使得IO读写次数变少。

B+树的内部结点并没有指向关键字具体信息的指针。因此其内部结点相对于B树更小。如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多。一次性读入内存中的需要查找的关键字也就越多。相对来说IO读写次数也就降低了。

2.B+树查询效率稳定。

搜索任何一个关键字,所走的路径长度是一样的,也就是说查每一个数据的效率相同。

3.B+树只需要遍历叶子节点(也就是最底层没有子节点的节点)就可以达到遍历整棵树的目的,这也解决了数据库的范围查询问题,而B数是不支持这样的操作的。

什么时候建立索引,什么时候少建或者不建索引呢?

1.表记录太少的话,不要建立索引了,因为建立索引表会增加查询的步骤,处理变慢;

2.经常插入、删除、修改的表尽量少的建立索引,因为索引表的维护也会降低性能;

3.对于那些数据都是重复且分布平均的字段,比如一个字段只有True和False两种数据,但是记录超多(假设100万行),这样建立索引是提高不了查询速度的;

4.不要将超多的字段建立在一个索引里,它会增加数据修改、插入和删除的时间的。

5.对于百万、千万级的数据库建立索引,相信我,它会有质的飞跃。

6.对于不会出现在where条件中的字段不要建立索引,不要再增加索引表的体积了。

1. 创建索引的语句

1.1 ALTER TABLE

1.创建普通的索引

alter table <table_name> add index <index_name> (`字段名`);

2.创建多个索引

alter table <table_name> add index <index_name> (`column`,`column1`,`column_N`.......);

索引名index_name是一个可选项,未指定时,MySQL将根据第一个索引列赋一个名称。

3.创建主键索引

alter table <table_name> add primary key (`字段名`);

4.创建唯一索引

alter table <table_name> add unique (`字段名`);

5.创建全文的索引

alter table <table_name> add fulltext (`字段名`);

1.2 CREATE INDEX

1.增加普通索引

create index <index_name> on table_name (`字段名`)

2.增加UNIQUE索引

create unique index <index_name> on <table_name> (`字段名`)

CREATE INDEX中索引名必须指定,而且只能增加普通索引和UNIQUE索引,不能增加PRIMARY KEY索引。

2. 删除索引

drop index <index_name> on <table_name>;
alter table <table_name> drop index <index_name>;
alter table <table_name> drop primary key;
相关文章
|
22小时前
|
机器学习/深度学习 算法 前端开发
【Python机器学习专栏】机器学习中的模型融合技术
【4月更文挑战第30天】模型融合,即集成学习,通过结合多个模型提升预测性能。常见方法包括:Bagging(如Random Forest)、Boosting(如AdaBoost、XGBoost)和Stacking。Python中可使用`scikit-learn`实现,例如BaggingClassifier示例。模型融合是机器学习中的强大工具,能提高整体性能并适应复杂问题。
|
22小时前
|
机器学习/深度学习 算法 算法框架/工具
【Python机器学习专栏】深度学习中的正则化与优化技术
【4月更文挑战第30天】本文探讨了深度学习中的正则化和优化技术,以提升模型的泛化能力和训练效率。正则化包括L1和L2正则化以及Dropout,防止过拟合。优化技术涵盖梯度下降法、动量法和Adam优化器,加速模型收敛。Python示例展示了如何在Keras中应用这些技术,如L2正则化、Dropout及Adam优化器。
|
23小时前
|
机器学习/深度学习 算法 Python
【Python机器学习专栏】数据特征选择与降维技术
【4月更文挑战第30天】本文探讨了Python中数据特征选择与降维技术在机器学习和数据分析中的应用。特征选择包括单变量选择、递归特征消除(RFE)、树模型的特征重要性和相关性分析,有助于去除冗余和无关特征。降维技术涵盖PCA、LDA以及非线性方法如KPCA和ISOMAP,用于在低维空间保留信息。这些技术能简化数据、提升模型性能及可解释性。
|
1天前
|
API 数据库 Python
Python web框架fastapi数据库操作ORM(二)增删改查逻辑实现方法
Python web框架fastapi数据库操作ORM(二)增删改查逻辑实现方法
|
1天前
|
关系型数据库 MySQL API
Python web框架fastapi数据库操作ORM(一)
Python web框架fastapi数据库操作ORM(一)
|
6天前
|
缓存 NoSQL 关系型数据库
在Python Web开发过程中:数据库与缓存,MySQL和NoSQL数据库的主要差异是什么?
MySQL与NoSQL的主要区别在于数据结构、查询语言和可扩展性。MySQL是关系型数据库,依赖预定义的数据表结构,使用SQL进行复杂查询,适合垂直扩展。而NoSQL提供灵活的存储方式(如JSON、哈希表),无统一查询语言,支持横向扩展,适用于处理大规模、非结构化数据和高并发场景。选择哪种取决于应用需求、数据模型及扩展策略。
17 0
|
6天前
|
SQL 缓存 数据库
在Python Web开发过程中:数据库与缓存,如何使用ORM(例如Django ORM)执行查询并优化查询性能?
在Python Web开发中,使用ORM如Django ORM能简化数据库操作。为了优化查询性能,可以:选择合适索引,避免N+1查询(利用`select_related`和`prefetch_related`),批量读取数据(`iterator()`),使用缓存,分页查询,适时使用原生SQL,优化数据库配置,定期优化数据库并监控性能。这些策略能提升响应速度和用户体验。
8 0
|
7天前
|
SQL 关系型数据库 MySQL
第十三章 Python数据库编程
第十三章 Python数据库编程
|
Web App开发 数据安全/隐私保护 Python