mysql联合索引怎么用 mysql联合索引存储结构

MySQL中如何设置唯一索引,联合索引?1.UNIQUE 关键字建唯一索引\x0d\x0amysql CREATE TABLE `wb_blog` (\x0d\x0a-`id` smallint(8) unsigned NOT NULL,\x0d\x0a-`catid` smallint(5) unsigned NOT NULL DEFAULT '0',\x0d\x0a-`title` varchar(80) NOT NULL DEFAULT '',\x0d\x0a-`content` text NOT NULL,\x0d\x0a-PRIMARY KEY (`id`),\x0d\x0a-UNIQUE KEY `catename` (`catid`)\x0d\x0a- ) ;\x0d\x0a如果建好表了 , 可以用以下语句建\x0d\x0a mysql CREATE UNIQUE INDEX catename ON wb_blog(catid);\x0d\x0a\x0d\x0a2.联合索引\x0d\x0aALTER TABLE `tasks`\x0d\x0aADD INDEX `testabc` (`title`, `created`) ;\x0d\x0a\x0d\x0a3联合唯一索引(假设有这个需求,在同一天内不能建两个tiltle一样的任务)\x0d\x0aALTER TABLE `tasks`\x0d\x0aADD UNIQUE INDEX `testabc` (`title`, `created`) ;\x0d\x0a\x0d\x0a数据库建索引的科学性事关数据库性能,索引也不是越多越好 。
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、联合索引与单列索引列 同时存在,使用单列索引
【mysql联合索引怎么用 mysql联合索引存储结构】 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、查询条件中有单列索引,则使用,无不使用 。
事例:
MySQL联表查询的索引使用一共3张表 knowledge ,knowledge_question ,knowledge_answer mysql联合索引怎么用,数据在 6000~10000 之间 。
执行mysql联合索引怎么用的语句mysql联合索引怎么用:
执行时间约 10分钟 ,查看执行计划如下mysql联合索引怎么用:
全部都是全表扫描,根据MySQL联表查询的算法 Nested-Loop Join  , MySQL查询的结果集是3张表的笛卡尔积,所以效率特别低 。
耗时变成 20毫秒
给Where条件建立索引,并不一定会使用 。
比如mysql联合索引怎么用:在表 knowledge 的字段 update 上建立索引 idx_time :
结果执行上来看 , 并没有使用索引 idx_time。

推荐阅读