Python面试题库-持续更新中

问题描述

  1. Python3里面的GIL锁是什么,怎么避免这个问题?
  2. Mysql索引,Django的model层如何加索引,怎么运用到mysql中呢?
  3. 索引为什么快?是怎么实现的?

题解分析:

题解1:Python3里面的GIL锁是什么,怎么避免这个问题?

是什么: Python中的GIL(Global Interpreter Lock,全局解释器锁)是CPython解释器(Python的默认实现)中的一个机制,它确保同一时刻只有一个线程执行Python字节码。GIL的设计初衷是为了简化CPython的内存管理(如引用计数)并避免多线程竞争问题,但它也导致多线程程序在CPU密集型任务中无法充分利用多核CPU。
怎么避免:

  1. 使用多进程替代多线程(不推荐,多进程不仅占用内存多,而且复杂)
  2. 使用Numpy等高效库:其底层C实现会释放GIL,多线程处理数组时可能并行。
  3. 分布式任务队列(如Celery):将任务分发到多台机器执行。
  4. 使用C扩展绕过GIL(干一些不需要操作python对象的 数据计算的活)

题解2:Mysql索引,Django的model层如何加索引,怎么运用到mysql中呢?

代码示例:

from django.db import modelsclass User(models.Model):name = models.CharField(max_length=100)email = models.CharField(max_length=100)created_at = models.DateTimeField(auto_now_add=True)class Meta:# 单字段索引indexes = [models.Index(fields=['name']),]# 联合索引(多字段)indexes = [models.Index(fields=['name', 'email']),]# 唯一索引indexes = [models.Index(fields=['email'], name='unique_email_idx', unique=True),]

如何应用到Django

python manage.py makemigrations   # 生成迁移脚本
python manage.py migrate   

引申知识

  1. 选择合适的字段

高频查询字段: WHERE、JOIN、ORDER BY、GROUP BY 涉及的字段。
高区分度字段: 字段值重复率低(如用户ID、邮箱)。
避免冗余索引: 联合索引 (A,B) 可替代单独的 (A) 索引。

  1. 索引类型选择
索引类型适用场景
普通索引(INDEX)常规查询优化
唯一索引(UNIQUE)确保字段唯一性(如邮箱、手机号)
全文索引(FULLTEXT)文本内容搜索(需使用MyISAM或InnoDB)
联合索引多条件组合查询

题解3:索引为什么快?是怎么实现的?

索引之所以能够大幅提升数据库查询速度,其核心原理在于通过高效的数据结构减少数据检索的扫描范围。

一、索引的底层数据结构

B+树:关系型数据库的核心结构

  • 树形分层:B+树是多层平衡树(通常3~4层),每层存储索引键值和子节点指针。
  • 有序性:所有叶子节点按索引键值排序,形成双向链表,支持高效范围查询。

示例:假设一个B+树高度为3,每页(16KB)存储1000个键值:

根节点(1页) → 1000个子节点

中间层(1000页) → 1000×1000=1,000,000个子节点

叶子层(1,000,000页) → 存储实际数据或数据指针

只需3次磁盘I/O即可定位到10亿级数据中的某一行。

  • 哈希索引:精确匹配的极速方案
  • O(1)时间复杂度: 通过哈希函数直接定位数据位置。
  • 局限性: 不支持范围查询,仅适用于等值查询(如WHERE id = 123)。

索引加速查询的三大机制

  1. 减少磁盘I/O次数
  • **全表扫描:**若表有1亿行,需读取所有数据页(假设每页100行,需100万次I/O)。
  • **索引扫描:**通过B+树定位到目标数据,仅需3~4次I/O(树高决定)。
  1. 有序性优化范围查询
-- 范围查询示例:查找2023年的订单
SELECT * FROM orders WHERE order_date BETWEEN '2023-01-01' AND '2023-12-31';
  • 无索引: 逐行扫描所有记录。
  • 有索引: 定位到2023-01-01的叶子节点,沿双向链表向后遍历至2023-12-31。
  1. 覆盖索引(Covering Index)
  • 无需回表:若索引包含查询所需的所有字段,直接返回索引数据。
-- 假设索引为 (user_id, name)
SELECT name FROM users WHERE user_id = 100;
-- 直接从索引叶子节点读取name,无需访问数据行。

索引的代价

  1. 写操作成本
    插入/更新/删除: 需维护B+树结构,可能触发节点分裂或合并。

示例:插入一条新记录到中间位置,可能导致叶子节点分裂为两页。

  1. 空间占用
    索引大小:一个联合索引(a,b,c)占用的空间可能超过原数据表。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/41844.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习threejs,使用多面体(IcosahedronGeometry、TetrahedronGeometry、OctahedronGeometry等)

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.PolyhedronGeometry …

DeepSeek详解:探索下一代语言模型

文章目录 前言一、什么是DeepSeek二、DeepSeek核心技术2.1 Transformer架构2.1.1 自注意力机制 (Self-Attention Mechanism)(a) 核心思想(b) 计算过程(c) 代码实现 2.1.2 多头注意力 (Multi-Head Attention)(a) 核心思想(b) 工作原理(c) 数学描述(d) 代码实现 2.1.3 位置编码 (…

【目标检测】【深度学习】【Pytorch版本】YOLOV1模型算法详解

【目标检测】【深度学习】【Pytorch版本】YOLOV1模型算法详解 文章目录 【目标检测】【深度学习】【Pytorch版本】YOLOV1模型算法详解前言YOLOV1的模型结构YOLOV1模型的基本执行流程YOLOV1模型的网络参数YOLOV1模型的训练方式 YOLOV1的核心思想前向传播阶段网格单元(grid cell)…

网络运维学习笔记(DeepSeek优化版) 022 HCIP-Datacom路由概念、BFD协议详解与OSPF第一课

文章目录 路由概念、BFD协议详解与OSPF第一课一、路由协议优先级与选路原则1.1 路由协议优先级对照表1.2 路由选路核心原则 二、BFD(Bidirectional Forwarding Detection,双向转发检测)的配置与应用2.1 双向心跳探测(双端配置&…

单应性矩阵(homography)

利用单应性矩阵计算内外参矩阵 利用单应性矩阵解决问题 问题描述:

Scavenge算法的优缺点问题

Scavenge 的缺点是只能使用堆内存中的一半,这是由划分空间和复制机制所决定的。但 Scavenge 由于只复制存活的对象,并且对于生命周期短的场景,存活对象只占少部分,所以它在时间效率上有优异的表现。 由于 Scavenge 是典型的牺牲空…

丝杆支撑座间隙调整不当会带来哪些影响?

丝杆支撑座是一种用于支撑滚珠丝杆的零件,通常用于机床、数控机床、自动化生产线等高精度机械设备中。支撑座间隙调整不当会对机械设备的运行产生多方面的影响,接下来一起了解一下: 1、降低加工精度:在机械加工设备中,…

Unity:EasyRoad3D插件学习 二期

前言: 书接上回。 一、场景视图状态: 创建好道路以后,切换到第一个选项,场景视图状态,查看道路信息,Main Settings修改道路名称、类型,宽度,是否闭环。 RoadWidth改为15&#xff…

内网渗透-DLL和C语言加载木马

免杀进阶技术 1、DLL的定义与使用 DLL:Dynamic Link library,动态链接库,是一个无法自己运行,需要额外的命令或程序来对其接口进行调用(类方法、函数)。 (1)在DevCpp中创建一个DLL项目 (2)在dllmain.c中定义源代码函数接口 #i…

一洽让常见问题的快速咨询,触手可及

在客户服务场景中,重复性常见问题的处理效率直接影响用户体验与客服成本。针对重复性常见问题,如何以直观的方式呈现给用户,使其能够快速、精准地提出咨询,已成为提升客户满意度的关键因素。 一、传统客服模式的效率枷锁 用户咨…

WEB攻防-Java安全SPEL表达式SSTI模版注入XXEJDBCMyBatis注入

目录 靶场搭建 JavaSec ​编辑​编辑 Hello-Java-Sec(可看到代码对比) SQL注入-JDBC(Java语言连接数据库) 1、采用Statement方法拼接SQL语句 2.PrepareStatement会对SQL语句进行预编译,但如果直接采取拼接的方式构造SQL,此时进行预编译也无用。 3、…

树莓集团南京园区启航:数字经济新地标!

深耕数字产业,构筑生态闭环 树莓集团在数字产业领域拥有超过十年的深厚积累,专注于构建“数字产业”的融合生态链。其核心优势在于有效整合政府、产业、企业及高校资源,形成一个协同创新、价值共生的产业生态闭环系统。 赋能转型&#xff0c…

Redis之bimap/hyperloglog/GEO

bimap/hyperloglog/GEO的真实需求 这些需求的痛点:亿级数据的收集清洗统计展现。一句话:存的进取得快多维度 真正有价值的是统计。 统计的类型 亿级系统中常见的四种统计 聚合统计 统计多个集合元素的聚合结果,就是交差并等集合统计。 排…

nara wpe去混响学习笔记

文章目录 1.WPE方法去混响的基本流程1.1.基本流程 2.离线迭代方法3.在线求法3.1.回顾卡尔曼方法3.2.在线去混响递推滤波器G方法 nara wpe git地址 博客中demo代码下载 参考论文 NARA - WPE: A Python Package for Weighted Prediction Error Dereverberation in Numpy and Ten…

JavaScript函数、箭头函数、匿名函数

1.示例代码(包括用法和注意事项) <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>JS-函数</title…

练习:求平方根

需求&#xff1a;键盘录入一个大于等于2的整数x&#xff0c;计算并返回x的平方根。结果只保留整数部分&#xff0c;小数部分将被舍去。 代码一&#xff1a; //求平方根 //方法一&#xff1a; package Online; import java.util.Scanner; public class SquareRoot {public sta…

win10 安装后的 系统盘的 分区

win10 安装后的 系统盘的 分区 MBR 分区 GPT 分区

反向 SSH 隧道技术实现内网穿透

反向 SSH 隧道技术实现内网穿透 场景描述 有一台内网的 Linux PC 机&#xff0c;想在其他地方&#xff08;如家中&#xff09;使用浏览器&#xff0c;在浏览器中能够使用内网 Linux PC 机的命令行。 实现思路 内网 Linux PC 机在内网可以使用 SSH 进行连接&#xff0c;但内…

[MRCTF2020]套娃

一。 按F12看源代码 发现代码 读代码发现 1.我们传的参数中不能存在_和%5f&#xff0c;可以通过使用空格来代替_&#xff0c;还是能够上传成功。 2.正则表达式"/^23333/ " &#xff0c;开头结尾都被 " " 和 " /"&#xff0c;开头结尾都被&qu…

基于Windows11的WSL2通过Ollama平台安装部署DeepSeek-R1模型

DeepSeek-R1模型各参数版本硬件要求 一、在Windows上安装Linux子系统WSL2 检查电脑是否支持虚拟化&#xff0c;按住<font style"color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">WindowsR</font>输入<font style"color:rgb(199,…