索引的弊端和查找sql慢的原因(面试)

索引的弊端
1.当数据量很大的时候,索引也会很大(当然相比于源表来说,还是相当小的),也需要存放在内存/硬盘中(通常存放在硬盘中),占据一定的内存空间/物理空间。

2.索引并不适用于所有情况:a.少量数据;b.频繁进行改动的字段,不适合做索引;c.很少使用的字段,不需要加索引;

3.索引会提高数据查询效率,但是会降低“增、删、改”的效率。当不使用索引的时候,我们进行数据的增删改,只需要操作源表即可,但是当我们添加索引后,不仅需要修改源表,也需要再次修改索引,很麻烦。尽管是这样,添加索引还是很划算的,因为我们大多数使用的就是查询,“查询”对于程序的性能影响是很大的。

查看sql的执行

语法:explain + SQL语句

例子:explain select * from 表名;

比较重要的关键字段:

id :编号

select_type :查询类型

table :表

type :类型

possible_keys :预测用到的索引

key :实际使用的索引

key_len :实际使用索引的长度

ref :表之间的引用

rows :通过索引查询到的数据量

Extra :额外的信息

### MySQL 分页查询面试常见问题及答案 #### 一、分页查询的基础概念 分页查询是指当数据量较大时,为了提高用户体验系统性能,将大量数据分成若干个小部分逐步展示的技术。在MySQL中,`LIMIT`子句常用于实现这一目的。 ```sql SELECT * FROM table_name LIMIT offset, row_count; ``` 此语法表示跳过前`offset`条记录并返回随后的`row_count`条记录[^2]。 #### 二、传统分页方法存在的问题 随着偏移量增大,即页面越往后翻阅,所需扫描的数据行数越多,这会导致严重的性能下降。对于拥有海量数据的大表而言尤为明显。每次请求都会造成全表扫描直到达到指定位置,从而增加了I/O开销以及锁等待时间。 #### 三、优化策略之一——基于主键范围查找 为了避免上述弊端,推荐采用基于主键或其他唯一索引字段的方式来进行分页操作: ```sql SELECT * FROM orders WHERE id > last_seen_id ORDER BY id ASC LIMIT page_size; ``` 这里假定`id`为主键列,并且按照升序排列;通过记住上一次获取到的最大ID(`last_seen_id`)来定位下一页起始点,这样可以有效减少不必要的遍历过程,显著改善响应速度[^3]。 #### 四、利用覆盖索引来加速读取 如果能够确保所选中的所有列都已建立合适的索引,则可以直接从索引树结构中提取所需信息而无需访问实际存储区内的原始行数据。这种方式被称为“覆盖索引”,它能极大程度降低磁盘IO成本,进而加快检索效率。 例如,在设计之初就考虑到可能涉及频繁分页显示的需求,提前规划好相应的复合索引组合,以便尽可能多地满足此类应用场景下的快速访问需求。 #### 五、其他注意事项 - **避免使用`ORDER BY RAND()`**:随机排序会强制整个表格参与运算,破坏了原有顺序关系,不利于后续增量加载; - **合理设置每页大小**:过大可能导致单次传输过多内容影响前端渲染效果,太小则增加网络交互次数拖整体流程; - **考虑缓存机制**:对于那些变动不频繁但又经常被浏览的部分列表项,适当引入客户端侧或服务端内存级缓存措施有助于减轻服务器负担。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值