面试题答案
一键面试可能造成性能瓶颈的点
- LIKE操作:
LIKE '%keyword%'
属于全表扫描,因为无法利用索引,对于大数据量的table2
表会非常耗时。 - 多表连接:
JOIN
操作如果表数据量很大,并且连接条件没有恰当的索引支持,会产生大量数据的笛卡尔积,消耗大量内存和CPU资源。 - 子查询:虽然题目中未明确给出子查询,但如果有子查询嵌套较深,也会增加查询复杂度和执行时间。
- 函数操作:虽然本题仅有的
COUNT(*)
函数在优化后影响不大,但如果有复杂函数,例如自定义函数,可能导致性能问题。 - GROUP BY和HAVING:分组和聚合操作会对数据进行排序和统计,如果数据量很大,这个过程会占用较多资源。
性能调优方法
- 优化LIKE操作:
- 如果数据库支持全文索引(如MySQL的FULLTEXT索引),对
table2.some_column
建立全文索引,然后使用MATCH AGAINST
替代LIKE
。例如:MATCH(table2.some_column) AGAINST('keyword' IN NATURAL LANGUAGE MODE)
。 - 如果不能使用全文索引,尝试将
LIKE '%keyword%'
改为LIKE 'keyword%'
,这样可以利用索引进行前缀匹配。
- 如果数据库支持全文索引(如MySQL的FULLTEXT索引),对
- 索引优化:
- 对
table1.id
和table2.table1_id
建立索引,确保连接条件能高效执行。 - 对
table2.some_column
建立合适的索引(如上述提到的全文索引或前缀索引)。
- 对
- 子查询优化:如果存在子查询,尽量将子查询改写为连接查询,通常连接查询的性能会更好。
- 避免复杂函数:如果有复杂函数,尝试在应用层进行计算,而不是在数据库层。对于简单的聚合函数
COUNT(*)
,数据库优化器通常能处理得较好。 - 合理调整LIMIT:如果数据量巨大,
LIMIT 50
可以结合OFFSET
分批获取数据,避免一次性返回大量数据造成内存压力。
调优对服务器其他资源的影响
- CPU:
- 索引优化后,CPU使用率可能会降低,因为减少了全表扫描和复杂计算的需求。例如,使用全文索引替代
LIKE '%keyword%'
操作,CPU无需逐行匹配字符串,减少了计算量。 - 但是,如果在调优过程中增加了复杂的索引维护操作(如创建复杂的联合索引),在索引创建和更新时可能会短暂增加CPU负载。
- 索引优化后,CPU使用率可能会降低,因为减少了全表扫描和复杂计算的需求。例如,使用全文索引替代
- 内存:
- 优化前,多表连接和全表扫描可能导致大量数据在内存中处理,占用较多内存。优化后,由于索引的使用和减少了不必要的数据扫描,内存占用可能会降低。
- 然而,如果创建过多索引,索引本身会占用一定内存空间,可能会对内存资源造成一定压力。
- 磁盘I/O:
- 索引优化使得数据定位更高效,减少了磁盘I/O操作,特别是对于大数据量的表。例如,合适的索引可以直接定位到符合条件的数据块,而不是全表扫描读取大量磁盘数据。
- 但索引的维护(如插入、更新、删除操作时对索引的同步更新)可能会增加一些磁盘I/O操作,尤其是对于频繁更新的表。