昨天遇到一个问题: 在一张有三十万条纪录的数据表A,其主键自增字段id,name字段(varchar),还有type_id(int),在name字段上已经添加了索引。type_id由于是整型字段,认为加索引没有太多的意义,所以没有加索引。 本次有一个需求是在一个循环中按type_id查询此表A,结果一执行此循环,mySQL立刻占用CPU到200%以上,导致服务器响应极慢。 开始没想到是查询速度的问题,后来发现换一个表,CPU占用率立刻下降。于是分析了查询过询,发现每次查询都要遍历整表,所以数据库压力非常大。手工直接使用sql在数据库查询: select * from A where type_id = xxxx 执行时间约为0.42s(400ms左右),速度较慢。 于是在type_id上添加索引,然后再执行同条语句。 执行时间为0.01s(10ms左右),速度明显提升(40倍左右)。 再执行循环,发现CPU占用8%左右,比较理想。 性能提升的原因分析: type_id的值有特殊性:大部分type_id的值为0,索引效果明显。正好本次查询不需要查询type_id为0的纪录。如果要查询type_id为0的纪录,则效果提升可能不明显。 体会: (1)在遇到查询性能的时候,适当的分析数据,添加索引,可能能大幅提高性能。 (2)是否添加索引,需要考量数据总量及数据更新频度再做决定。 (3)分析一条语句是否使用了索引。可使用 explain sql; 如explain select * from A where type_id = xxxx 会显示是否使用索引。 |
给mysql数据表加索引的一次经验与体会.
最新推荐文章于 2024-01-12 22:15:00 发布