数据库索引优化实例
索引对于查找小表或者需要处理表中大部分或全部行的大型表的查询不太重要,适合的才是最好的。
数据库索引的操作
- 快速找到匹配where条件的行结果;
- 如果有多个索引,MySQL通常会使用能检索除最少结果行的索引;
- 如果有多列索引,优化器可以使用索引的最左边的前缀来查找行;比如有col1,col2,col3三列索引,那么你就可以使用(col1),(col1,col2),(col1,col2,col3)三个索引;
- 如果有多表连接join的语句,mysql会将varchar(10)和char(10)看成同一个类型并且有效的使用索引;两个表使用的字符要一样比如utf8,和latin,就不行;
- 在查找最小值和最大值的时候,优化器会先优化你是否在where条件中有常量值;
- 索引排序会使用最左边的索引列前缀;
- 在某些情况下,可以优化查询来检索值,而不必咨询数据行
主键与外键优化
主键索引的查询优化得益于主键不能为NULL值。表的数据在物理存储上就被组织为基于主键列或多列进行快速查找和排序。如果你的表很大又非常重要,然而却没有声明主键,或者组合主键,那么你需要新建一个新的列使用auto-increment来作为主键。
外键优化,如果有一个大表,有许多列,可以考虑将表的列进行拆分成小表,并且用外键关联。每个小表都有主键,这样可以让查找数据更加快速,而需要数据的时候也可以是使用join关联查询。由于数据是分散的,查询可以有更少的I/O,并且会使用更少的缓存。因为相关的列在磁盘中存储在一块。
组合索引
建立一个表:
1 | CREATE TABLE test ( |
我们有组合索引name,在索引查询中使用最左列查询是会使用索引的。也就是如下面的列子:
1 | SELECT * FROM test WHERE last_name='Widenius'; |
即只要有最左侧的索引列,那么索引就会生效。但是如果是单独使用的first_name,那么索引将不会生效,如下面的示例: