面试题答案
一键面试-
插入新数据:
INSERT INTO user_info (id, name, extra_data) VALUES (1, '张三', '{"hobbies":["篮球","足球"]}');
上述示例假设
user_info
表有id
(用户ID)、name
(用户名)和extra_data
字段,实际应用中请根据表结构调整字段名和值。 -
查询爱好包含“篮球”的用户记录: 在MySQL 8.0及以上版本,可以使用JSON函数进行查询:
SELECT * FROM user_info WHERE JSON_EXTRACT(extra_data, '$[*].hobbies') LIKE '%"篮球"%';
这里
JSON_EXTRACT
函数提取extra_data
中hobbies
数组的值,然后通过LIKE
操作符查找包含“篮球”的记录。 -
优化技巧:
- 索引优化:
- MySQL对JSON类型字段的索引支持有限。但如果
extra_data
中某些固定的属性经常用于查询,可以考虑在这些属性上创建生成列索引。例如,如果hobbies
总是以相同的结构存储,可以创建一个生成列来提取hobbies
字段,然后对该生成列创建索引。
这样查询时可以利用该索引加速查询。ALTER TABLE user_info ADD COLUMN hobbies_extract VARCHAR(255) GENERATED ALWAYS AS (JSON_UNQUOTE(JSON_EXTRACT(extra_data, '$[*].hobbies'))) VIRTUAL; CREATE INDEX idx_hobbies ON user_info (hobbies_extract);
- MySQL对JSON类型字段的索引支持有限。但如果
- 减少数据扫描:
- 只选择需要的字段,而不是使用
SELECT *
。例如:
减少返回的数据量,从而减少I/O和网络传输开销。SELECT id, name FROM user_info WHERE JSON_EXTRACT(extra_data, '$[*].hobbies') LIKE '%"篮球"%';
- 只选择需要的字段,而不是使用
- 查询缓存:
- 如果查询频率较高,且数据更新不频繁,可以考虑使用MySQL的查询缓存(虽然在高并发写入场景下可能有性能问题)。开启查询缓存后,相同的查询会直接从缓存中获取结果,而不需要再次执行查询语句。在MySQL配置文件(如
my.cnf
)中设置query_cache_type = 1
来开启查询缓存。
- 如果查询频率较高,且数据更新不频繁,可以考虑使用MySQL的查询缓存(虽然在高并发写入场景下可能有性能问题)。开启查询缓存后,相同的查询会直接从缓存中获取结果,而不需要再次执行查询语句。在MySQL配置文件(如
- 索引优化: