MySQL之主键

MySQL之主键,第1张

主键是一个索引,mysql的索引是B+树,Mysql会按照键值的大小进行顺序存放,如果我们设置自增id为主键,这个时候主键是按照一种紧凑的接近顺序写入的方式进行存储数据。如果我们用其他字段作为主键的话,此时Mysql不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉,此时又要从磁盘上读回来,这增加了很多额外的开销,同时频繁的移动、分页 *** 作造成了大量的碎片。

- 考虑性能消耗

- 考虑资源消耗

- 考虑分库分表

表button 

CREATE TABLE `button` (

  `id` bigint(20) NOT NULL AUTO_INCREMENT,  --主键索引

  `button_name` varchar(45) NOT NULL COMMENT '功能名称',

  `app_id` bigint(20) NOT NULL,

  `permission_id` bigint(20) DEFAULT NULL,  -- permission_id 和 app_id 联合索引。

  `api_id` bigint(20) NOT NULL, --api_id单独索引

  PRIMARY KEY (`id`),

  KEY `index_app_permission_lianhe` (`permission_id`,`app_id`) USING BTREE,

  KEY `index_api_id_dange` (`api_id`)

) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

主键索引,单独索引,组合索引使用场景及优化

表button 有3个索引,分别是:id主键,联合索引(permission_id,app_id),api_id(单列索引)

button_name 无索引

查询where条件中:

主键索引:

1、主键索引与联合索引同时存在,使用主键索引

2、主键索引与单个索引同时存在,使用主键索引

结论:只要主键索引在,使用主键索引。

联合索引 :

1、联合索引与单列索引列 同时存在,使用单列索引

2、联合索引中列顺序颠倒无影响。

3、联合索引实行最左侧原则,即:单独查询条件中只有permission_id可以使用联合索引,单独查询条件中只有app_id不实用联合索引。

4、如果查询条件中只有app_id,但是select 条件中有 permission_id,则也使用联合索引。

5、select id,app_id from button where app_id=1001使用联合索引

6、explain select id,app_id,button_name from button where app_id=1001不使用联合索引

结论:索引优先级:主键索引,单列索引,组合索引

    联合索引中遵从最左侧列原则。

    当查询条件和返回结果中仅仅包含联合索引中索引项,也使用联合索引。如第4条。

    当查询条件中出现联合索引中非最左侧索引列,返回结果中含义联合索引中的列或者主键则也使用联合索引。

单个索引:

1、查询条件中有单列索引,则使用,无不使用。

事例:


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/8697023.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-20
下一篇 2023-04-20

发表评论

登录后才能评论

评论列表(0条)

保存