我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL优化之联合索引

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL优化之联合索引

1.表结构

(root@localhost) [test]> show create table t_demo\G;
*************************** 1. row ***************************
       Table: t_demo
Create 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 

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 |
+----+-------------+-------+------------+-------+------------------------------+------------------------------+---------+------+-------+-------------+

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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL优化之联合索引

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL优化之索引

SQL为什么需要优化?对于初学者来说,能够写出实现功能的SQL语句而不出错,查询出所需要的结果,就已经能够满足日常使用了。但在某些场景,对性能的要求比较高,因此,要求SQL的执行响应速度快,就需要对SQL进行一定程度的优化。在实际应用场景中,MySQL经常会存
MySQL优化之索引
2021-02-14

MySQL优化之索引解析

索引的本质MySQL索引或者说其他关系型数据库的索引的本质就只有一句话,以空间换时间。索引的作用索引关系型数据库为了加速对表中行数据检索的(磁盘存储的)数据结构索引的分类数据结构上面的分类HASH 索引等值匹配效率高不支持范围查找树形索引二叉树,递归二分查找法
MySQL优化之索引解析
2019-07-07

MySQL索引优化之适合构建索引的几种情况详解

目录结论建立索引的场景小结结论在where后面的过滤字段上建立索引(select/update/delete后面的where都是适用的),使用索引加快过滤效率,不用进行全表扫描在具有唯一要求的字段上添加唯一索引,加快查询效率,查到即可直接
2022-07-29

MYSQL联合唯一索引

https://blog.csdn.net/weistin/article/details/79698996
MYSQL联合唯一索引
2019-08-28

MYSQL创建联合索引

在创建表的时候即指定联合索引,例如 -- 如果存在表,则删除DROP TABLE IF EXISTS core_fund_shares -- 创建表CREATE TABLE `core_fund_shares` ( `fund_code`
2023-08-30

mysql的联合索引(复合索引)的实现

联合索引 本文中联合索引的定义为(MySQL):ALTER TABLE `table_name` ADD INDEX (`col1`,`col2`,`col3`);联合索引的优点 若多个一条SQL,需要多个用到两个条件SELECT * FR
2022-05-29

MySQL索引优化

一、单表创建索引之前:type=ALL全表扫描,Extra里面的Using filesort(文件内部排序)根据where后面的条件创建:CREATE INDEX idx_article_ccv ON article(category_id,comments,
MySQL索引优化
2019-01-06

Mysql性能优化之索引下推

索引下推(index condition pushdown )简称ICP,在Mysql5.6的版本上推出,用于优化查询。 在不使用ICP的情况下,在使用非主键索引(又叫普通索引或者二级索引)进行查询时,存储引擎通过索引检索到数据,然后返回给
2022-05-19

[MySQL] mysql索引的长度计算和联合索引

1.所有的索引字段,如果没有设置not null,则需要加一个字节。2.定长字段,int占4个字节、date占3个字节、char(n)占n个字符。3.变长字段,varchar(n),则有n个字符+两个字节。4.不同的字符集,一个字符占用的字节数不同。latin
[MySQL] mysql索引的长度计算和联合索引
2021-12-22

MySQL索引优化之不适合构建索引及索引失效的几种情况详解

目录结论不建议建立索引的场景索引失效的场景小结结论具体案例下文有详尽描述不适合建立索引的场景:数据量比较小的表不建议建立索引有大量重复数据的字段上不建议建立索引(类似:性别字段)需要进行频繁更新的表不建议建立索引where、group
2022-07-29

编程热搜

目录