云数据库 GAUSSDB(FOR MYSQL)-SQL使用规范:数据库索引设计规范

时间:2023-12-18 15:54:23

数据库索引设计规范

  • 根据实际业务需求,减少使用无法利用索引优化的order by查询语句。Order by、group by、distinct这些语句较为耗费CPU资源。
  • 涉及到复杂SQL语句时,优先参考已有索引进行设计,通过执行explain,查看执行计划,利用索引,增加更多查询限制条件。
  • 使用新的SELECT、UPDATE、DELETE语句时,都需要通过explain查看执行计划中的索引使用情况,尽量避免extra列出现:Using File Sort,Using Temporary。当执行计划中扫描的行数超过1000时,需要评估是否允许上线。需每日进行慢日志统计分析,处理慢日志语句。
    explain解读:
    • type:ALL, index, range, ref, eq_ref, const, system, NULL(从左到右,性能从差到好)。
    • possible_keys:指出MySQL能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用。
    • key:表示MySQL实际决定使用的键(索引),如果没有选择索引,键是NULL。要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX 或者IGNORE INDEX。
    • ref:哪些列或常量被用于查找索引列上的值。
    • rows:根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数。
    • Extra:
      • Using temporary:表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询。
      • Using filesort:MySQL中无法利用索引完成的排序操作称为“文件排序”。
      • Using index:表示使用索引,如果只有 Using index,说明没有查询到数据表,只用索引表即完成了这个查询,这种情况为覆盖索引。如果同时出现Using where,代表使用索引来查找读取记录, 也是可以用到索引的,但是需要查询到数据表。
      • Using where:表示条件查询,如果不读取表的所有数据,或不是仅仅通过索引就可以获取所有需要的数据,则会出现 Using where。如果type列是ALL或index,而没有出现该信息,则你有可能在执行错误的查询,返回所有数据。
  • 在WHERE条件列上使用函数,会导致索引失效。

    示例:如 WHERE left(name, 5) = 'zhang',left函数会导致name上的索引失效。

    修改方案:可在业务侧修改该条件,不使用函数。当返回结果集较小时,业务侧过滤满足条件的行。

support.huaweicloud.com/usermanual-gaussdbformysql/gaussdbformysql_05_0105.html