千家信息网

MySQL优化之联合索引

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,1.表结构(root@localhost) [test]> show create table t_demo\G;*************************** 1. row ********
千家信息网最后更新 2026年11月01日MySQL优化之联合索引

1.表结构

(root@localhost) [test]> show create table t_demo\G;*************************** 1. row ***************************       Table: t_demoCreate Table: CREATE TABLE `t_demo` (  `vin` varchar(17) NOT NULL DEFAULT '' COMMENT '底盘号',  `lng` decimal(10,6) DEFAULT NULL COMMENT 'GPS经度',  `lat` decimal(10,6) DEFAULT NULL COMMENT 'GPS纬度',  `gps_time` datetime DEFAULT NULL,  `crmkey` char(36) DEFAULT NULL ,  `veh_model_desc` varchar(30) DEFAULT NULL ,  `veh_series_desc` varchar(30) DEFAULT NULL ,  `update_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' ,  PRIMARY KEY (`vin`,`update_time`),  KEY `idx_crmkey` (`crmkey`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 /*!50100 PARTITION BY RANGE (to_days(update_time))(PARTITION p20160724 VALUES LESS THAN (736535) ENGINE = InnoDB, PARTITION p20160725_0731 VALUES LESS THAN (736542) ENGINE = InnoDB, PARTITION p20160801_0807 VALUES LESS THAN (736549) ENGINE = InnoDB, PARTITION p20160808_0814 VALUES LESS THAN (736556) ENGINE = InnoDB, PARTITION p20160815_0821 VALUES LESS THAN (736563) ENGINE = InnoDB, PARTITION p20160822_0828 VALUES LESS THAN (736570) ENGINE = InnoDB, PARTITION p20160829_0904 VALUES LESS THAN (736577) ENGINE = InnoDB, PARTITION p20160905_0911 VALUES LESS THAN (736584) ENGINE = InnoDB, PARTITION p20160912_0918 VALUES LESS THAN (736591) ENGINE = InnoDB, PARTITION p20160919_0925 VALUES LESS THAN (736598) ENGINE = InnoDB, PARTITION p20160926_1002 VALUES LESS THAN (736605) ENGINE = InnoDB, PARTITION p20161003_1009 VALUES LESS THAN (736612) ENGINE = InnoDB, PARTITION p20161010_1016 VALUES LESS THAN (736619) ENGINE = InnoDB, PARTITION p20161017_1023 VALUES LESS THAN (736626) ENGINE = InnoDB, PARTITION p20161024_1030 VALUES LESS THAN (736633) ENGINE = InnoDB, PARTITION p20161031_1106 VALUES LESS THAN (736640) ENGINE = InnoDB, PARTITION p20161107_1113 VALUES LESS THAN (736647) ENGINE = InnoDB, PARTITION p20161114_1120 VALUES LESS THAN (736654) ENGINE = InnoDB, PARTITION p20161121_1127 VALUES LESS THAN (736661) ENGINE = InnoDB, PARTITION p20161128_1204 VALUES LESS THAN (736668) ENGINE = InnoDB, PARTITION p20161205_1211 VALUES LESS THAN (736675) ENGINE = InnoDB, PARTITION p20161212_1218 VALUES LESS THAN (736682) ENGINE = InnoDB, PARTITION p20161219_1225 VALUES LESS THAN (736789) ENGINE = InnoDB, PARTITION p20161226_170101 VALUES LESS THAN (736796) ENGINE = InnoDB) */1 row in set (0.00 sec)

2.查看执行计划

(root@localhost) [test]> explain partitions SELECT COUNT(1)    -> FROM t_demo tvghg    -> WHERE tvghg.crmkey ='cf71ea00-65ff-4521-b336-fdc13846e2e2'    ->   AND tvghg.update_time >=  '2016-07-19 06:00:00'     ->  AND tvghg.update_time < '2016-07-19 07:00:00'     -> AND (tvghg.veh_series_desc IN ( 'A6', 'A6L'));+----+-------------+-------+------------+------+---------------+------------+---------+-------+---------+-------------+| id | select_type | table | partitions | type | possible_keys | key        | key_len | ref   | rows    | Extra       |+----+-------------+-------+------------+------+---------------+------------+---------+-------+---------+-------------+|  1 | SIMPLE      | tvghg | p20160724  | ref  | idx_crmkey    | idx_crmkey | 109     | const | 1961366 | Using where |+----+-------------+-------+------------+------+---------------+------------+---------+-------+---------+-------------+1 row in set (0.00 sec)

3.查看选择率

(root@localhost) [test]> select count(distinct(crmkey))/count(*) AS selectivity1,count(distinct(update_time))/count(*) AS selectivity2, count(distinct(veh_series_desc))/count(*) AS selectivity3 from t_demo;+--------------+--------------+--------------+| selectivity1 | selectivity2 | selectivity3 |+--------------+--------------+--------------+|       0.0001 |       0.0000 |       0.0000 |+--------------+--------------+--------------+1 row in set (43.95 sec)select count(distinct(concat(crmkey,update_time)))/count(*) from t_demo;+------------------------------------------------------+| count(distinct(concat(crmkey,update_time)))/count(*) |+------------------------------------------------------+|                                               0.0136 |+------------------------------------------------------+1 row in set (52.66 sec)
4.查询时间
(root@localhost) [test]> SELECT COUNT(1)    -> FROM t_demo tvghg    -> WHERE tvghg.crmkey ='cf71ea00-65ff-4521-b336-fdc13846e2e2'    ->   AND tvghg.update_time >=  '2016-07-19 06:00:00'     ->  AND tvghg.update_time < '2016-07-19 07:00:00'     -> AND (tvghg.veh_series_desc IN ( 'A6', 'A6L'));+----------+| COUNT(1) |+----------+|     2695 |+----------+1 row in set (3.67 sec)

这里考虑索引怎么创建,涉及到多个字段,需要我们去做判断,查看选择率是我们创建索引的一个很重要的参考。这里的表是一个分区表,按照时间做的分区,查询字段里也包含时间字段,索引创建索引我们肯定要有时间字段的哦。

5.创建索引

(root@localhost) [(none)]> create index idx_tvghg_crmkey_update_time on `test`.`t_demo`(crmkey,update_time);Query OK, 0 rows affected (4 min 40.21 sec)Records: 0  Duplicates: 0  Warnings: 0(root@localhost) [test]> alter table `test`.`t_demo` drop index idx_crmkey;Query OK, 0 rows affected (1.16 sec)Records: 0  Duplicates: 0  Warnings: 0

6.查询,查看执行计划

SELECT COUNT(1)     FROM t_demo tvghg     WHERE tvghg.crmkey ='cf71ea00-65ff-4521-b336-fdc13846e2e2'       AND tvghg.update_time >=  '2016-07-19 06:00:00'       AND tvghg.update_time < '2016-07-19 07:00:00'      AND (tvghg.veh_series_desc IN ( 'A6', 'A6L'));+----------+| COUNT(1) |+----------+|     2695 |+----------+1 row in set (0.03 sec)(root@localhost) [test]> explain partitions SELECT COUNT(1)    ->      FROM t_demo tvghg    ->      WHERE tvghg.crmkey ='cf71ea00-65ff-4521-b336-fdc13846e2e2'    ->        AND tvghg.update_time >=  '2016-07-19 06:00:00'     ->       AND tvghg.update_time < '2016-07-19 07:00:00'     ->      AND (tvghg.veh_series_desc IN ( 'A6', 'A6L'));+----+-------------+-------+------------+-------+------------------------------+------------------------------+---------+------+-------+-------------+| id | select_type | table | partitions | type  | possible_keys                | key                          | key_len | ref  | rows  | Extra       |+----+-------------+-------+------------+-------+------------------------------+------------------------------+---------+------+-------+-------------+|  1 | SIMPLE      | tvghg | p20160724  | range | idx_tvghg_crmkey_update_time | idx_tvghg_crmkey_update_time | 114     | NULL | 12446 | Using where |+----+-------------+-------+------------+-------+------------------------------+------------------------------+---------+------+-------+-------------+

创建索引绝对是一个技术活,在尽量占用少的磁盘空间,创建出合理的索引,还是要多了解业务,知己知彼。在上线前评估好,真的上线了,创建索引对系统也会有不小的影响。

索引 字段 时间 查询 选择 重要 知己知彼 业务 多个 底盘 技术 技术活 知己 磁盘 空间 系统 纬度 经度 结构 还是 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 天津市摩尔互联网科技 朗新科技与工业互联网 与互联网科技公司 兼蜜互联网科技 广州紫鲸互联网科技 深圳前海聚择互联网科技有限公司 互联网企业和科技型企业 华服互联网科技官网 宁夏众和广鑫互联网科技有限公司 互联网科技项目计划书材料类 互联网科技公司有风险吗 宜昌元轩互联网科技有限公司 米聚互联网科技南京有限公司排面 世界互联网领先科技成果获奖 徐州市互联网科技有限公司 广州百诚互联网科技有限公司官网 半导体行业属于互联网高科技类吗 广州梦谷互联网科技有限公司领导 互联网领先科技成果宣传视频 平安好医生打造互联网科技医疗 科技互联网 哈尔滨大商圈互联网科技有限公司 杭州互联网科技公司 深圳齐家互联网科技 火传媒上海互联网科技 栖莱科技互联网股份有限公司 语蝶互联网科技有限公司 江苏互联网科技小贷 西安有哪些互联网高科技企业 世界互联网科技成果奖
0