索引设计原则

本文详细介绍了MySQL数据库索引的优化策略,包括如何选择合适的索引类型,如唯一索引和短索引,以及如何利用最左前缀原则。文章还讨论了索引过多的负面影响,以及InnoDB表的主键选择策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据库常用索引来提高检索数据性能,本次主要针对mysql 5.0的索引类型

  • 索引列最好是能够出现在where子句中,可以提高查询效率,或连接子句中指定的列。
  • 建议使用唯一索引。索引列值的离散度(唯一性,不一致性)越高越好,即为索引列的基数越大,索引效果越好。eg:身份证列,生日列可作为索引,较易区分各行;而性别则不适合,不管搜索哪个,都出现一半的行数据,并不会体现索引快查特性。
  • 短索引,如果对字符串列索引,应该指定前缀长度,尽可能这样做。eg: 有一个char(200)列,如果在前n(10/20)个字符内,多数值是唯一的,那么可以不用对整个列进行索引。
    1 对前n个字符进行索引能够节省大量索引空间,可使查询更快。
    2 较小的索引涉及的磁盘IO较少
    3 较短的值比较起来更快。
    4 对较短的键值,索引高速缓存中的块能容纳更多的键值。
    5 mysql在内存中可以容纳更多的值
    6 不用读取索引中较多块,提高找到行的可能性。
  • 最左前缀。即为多列索引,在创建一个n列索引时,实际则为创建了mysql可利用的n个索引。多列索引可起几个索引的作用,因为可利用索引中最左边的列集来匹配行。这样的列集为最左前缀。
  • 有索引固然好,但索引过多反而会降低效率。索引越多,花费的时间越长。只保持所需索引有利于查询优化。
    1 每个额外的索引都要占用额外的磁盘空间,并降低写操作的性能。
    2 在修改表的内容时,索引必须进行更新,有时可能要重构。如果有的索引很少或不使用,会不必要的减缓表的修改速度
    3 mysql在生成一个执行计划时,要考虑各个索引,如果索引过多,则会耗时较多。
  • InnoDB表的存储与查询,按照主键或内部列进行访问是最快的,索引innodb表尽量自己指定主键,
    1 当表中同时几个列都是唯一的,均可做主键时,选择最长作为检索条件的列作为主键做一年,可提高查询效率。
    2 InnoDB表的普通索引都会保存主键的键值,所以主键要尽可能选择较短的数据类型,可以有效地减少索引的磁盘占用,提高索引的缓存效果。
    3 记录默认按一定顺序保存,如有明确主键,按主键 顺序 ~ 保存.
    4 如果没有主键,但有唯一索引,按唯一索引顺序保存。
    5 主键和唯一索引均没有, 表中会自动生成一个内部列,按照该内部列的顺序保存。

创建索引:create view v_payment [as select * from payment]

mysql> create view v_payment as select *from payment_myisam;
Query OK, 0 rows affected (0.00 sec)

MySQL修改索引名称:

对于MySQL 5.7及以上版本,可以执行以下命令:

1 ALTER TABLE tbl_name RENAME INDEX old_index_name TO new_index_name

对于MySQL 5.7以前的版本,可以执行下面两个命令:
1 ALTER TABLE tbl_name DROP INDEX old_index_name
2 ALTER TABLE tbl_name ADD INDEX new_index_name(column_name)

对于MySQL 5.7以前的版本,可以执行下面两个命令:

1 ALTER TABLE tbl_name DROP INDEX old_index_name
2 ALTER TABLE tbl_name ADD INDEX new_index_name(column_name)

我的mysql版本为:

mysql> select version();
+-----------+
| version() |
+-----------+
| 5.6.38    |
+-----------+
1 row in set (0.00 sec)

eg:修改索引名称

mysql>  ALTER TABLE rental DROP INDEX rental_date;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql>  alter table rental add index idx_rental_date(rental_date,inventory_id,customer_id);
Query OK, 0 rows affected (0.11 sec)
Records: 0  Duplicates: 0  Warnings: 0

附:
设计索引的原则;
1 在where子句中的列和连接字句中的列
2 建议使用唯一索引,因为索引列基数越大,索引效果越好。
3 使用短索引。较小的索引涉及到磁盘io较少,较短的值比较起来更快。这种较短的键值,索引高速缓存中的块能容纳更多的键值,
4 使用最左前缀。
5 不要过度索引。每个额外的索引都要占用额外的磁盘空间,并降低写操作性能。
6 尽量不要创建经常变更的列为索引。因为每次更新,有时可能需要重构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值