设为首页 收藏本站
查看: 1460|回复: 0

[经验分享] SQL优化案例分享--联合索引

[复制链接]

尚未签到

发表于 2018-10-20 10:40:40 | 显示全部楼层 |阅读模式
  下面这个SQL如何优化:
  desc select count(*) as total from Art_Person a, Art_Works b where a.PersonCode=b.PersonCode;
  +----+-------------+-------+-------+---------------+------------+---------+---------------------+--------+-------------+

  |>  +----+-------------+-------+-------+---------------+------------+---------+---------------------+--------+-------------+
  |  1 | SIMPLE      | b     | index | PersonCode    | PersonCode | 25      | NULL                | 166904 | Using index |
  |  1 | SIMPLE      | a     | ref   | PersonCode    | PersonCode | 24      | newart.b.PersonCode |      1 | Using index |
  +----+-------------+-------+-------+---------------+------------+---------+---------------------+--------+-------------+
  2 rows in set (0.00 sec)
  mysql> show profile for query 2;
  +----------------------+----------+
  | Status               | Duration |
  +----------------------+----------+
  | starting             | 0.000149 |
  | checking permissions | 0.000015 |
  | checking permissions | 0.000015 |
  | Opening tables       | 0.000049 |
  | System lock          | 0.000032 |
  | init                 | 0.000065 |
  | optimizing           | 0.000032 |
  | statistics           | 0.000053 |
  | preparing            | 0.000039 |
  | executing            | 0.000019 |
  | Sending data         | 2.244108 |
  | end                  | 0.000042 |
  | query end            | 0.000008 |
  | closing tables       | 0.000023 |
  | freeing items        | 0.000038 |
  | logging slow query   | 0.000007 |
  | logging slow query   | 0.000008 |
  | cleaning up          | 0.000008 |
  +----------------------+----------+
  18 rows in set (0.00 sec)
  mysql> show create table Art_Works\G
  *************************** 1. row ***************************
  Table: Art_Works
  Create Table: CREATE TABLE `Art_Works` (
  `PID` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`PID`),
  KEY `ViewCount` (`ViewCount`),
  KEY `PersonCode` (`PersonCode`) USING BTREE,
  KEY `GoodsStatus` (`GoodsStatus`) USING BTREE,
  KEY `CreateTime` (`CreateTime`) USING BTREE,
  KEY `RelWorkID` (`RelWorkID`) USING BTREE
  ) ENGINE=MyISAM AUTO_INCREMENT=210549 DEFAULT CHARSET=utf8
  mysql> show create table Art_Person\G
  *************************** 1. row ***************************
  Table: Art_Person
  Create Table: CREATE TABLE `Art_Person` (
  `PID` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`PID`),
  UNIQUE KEY `MemberID` (`MemberID`),
  KEY `PersonCode` (`PersonCode`) USING BTREE
  ) ENGINE=MyISAM AUTO_INCREMENT=8699 DEFAULT CHARSET=utf8
  1 row in set (0.00 sec)
  解决办法(索引的问题):带着主键,改成联合索引。count() 的时候 带上 主键 就ok了 不然不会走的。其实这个索引就是为了小表驱动大表,只是大表的索引 对count()而言 没用。加上 主键 就可以了。

  mysql>>  Query OK, 8666 rows affected (0.49 sec)
  Records: 8666  Duplicates: 0  Warnings: 0

  mysql>>  Query OK, 166904 rows affected (6.02 sec)
  Records: 166904  Duplicates: 0  Warnings: 0
  mysql> desc  select sql_no_cache count(*) as total from Art_Works b,Art_Person a force index (PersonCode) where b.PersonCode=a.PersonCode;
  +----+-------------+-------+-------+-------------------+------------+---------+---------------------+------+--------------------------+

  |>  +----+-------------+-------+-------+-------------------+------------+---------+---------------------+------+--------------------------+
  |  1 | SIMPLE      | a     | index | PersonCode        | PersonCode | 24      | NULL                | 8666 | Using index              |

  |  1 | SIMPLE      | b     | ref   | PersonCode,idx_PU |>  +----+-------------+-------+-------+-------------------+------------+---------+---------------------+------+--------------------------+
  2 rows in set (0.00 sec)
  下面是删除索引,看看count(1)这么走。

  mysql>>  Query OK, 8666 rows affected (0.45 sec)
  Records: 8666  Duplicates: 0  Warnings: 0

  mysql>>  Query OK, 166904 rows affected (3.90 sec)
  Records: 166904  Duplicates: 0  Warnings: 0
  mysql>  select sql_no_cache count(1) as total from Art_Works b,Art_Person a force index (PersonCode) where b.PersonCode=a.PersonCode;
  +--------+
  | total  |
  +--------+
  | 166657 |
  +--------+
  1 row in set (2.38 sec)

  mysql>>  Query OK, 166904 rows affected (4.32 sec)
  Records: 166904  Duplicates: 0  Warnings: 0
  mysql>  select sql_no_cache count(1) as total from Art_Works b,Art_Person a force index (PersonCode) where b.PersonCode=a.PersonCode;
  +--------+
  | total  |
  +--------+
  | 166657 |
  +--------+
  1 row in set (0.44 sec)
  mysql> desc select sql_no_cache count(1) as total from Art_Works b,Art_Person a force index (PersonCode) where b.PersonCode=a.PersonCode;
  +----+-------------+-------+-------+-------------------+------------+---------+---------------------+------+--------------------------+

  |>  +----+-------------+-------+-------+-------------------+------------+---------+---------------------+------+--------------------------+
  |  1 | SIMPLE      | a     | index | PersonCode        | PersonCode | 24      | NULL                | 8666 | Using index              |

  |  1 | SIMPLE      | b     | ref   | PersonCode,idx_PU |>  +----+-------------+-------+-------+-------------------+------------+---------+---------------------+------+--------------------------+
  2 rows in set (0.00 sec)
  下面是去掉大表的索引:把大表的索引去掉  count(PersonCode) 也没用,还是不走索引

  mysql>>  Query OK, 166904 rows affected (3.82 sec)
  Records: 166904  Duplicates: 0  Warnings: 0
  mysql> desc select sql_no_cache count(b.PersonCode) as total from Art_Works b,Art_Person a force index (PersonCode) where b.PersonCode=a.PersonCode;
  +----+-------------+-------+-------+---------------+------------+---------+---------------------+--------+-------------+

  |>  +----+-------------+-------+-------+---------------+------------+---------+---------------------+--------+-------------+
  |  1 | SIMPLE      | b     | index | PersonCode    | PersonCode | 25      | NULL                | 166904 | Using index |
  |  1 | SIMPLE      | a     | ref   | PersonCode    | PersonCode | 24      | newart.b.PersonCode |     13 | Using index |
  +----+-------------+-------+-------+---------------+------------+---------+---------------------+--------+-------------+
  2 rows in set (0.00 sec)
  mysql>  select sql_no_cache count(b.PersonCode) as total from Art_Works b,Art_Person a force index (PersonCode) where b.PersonCode=a.PersonCode;
  +--------+
  | total  |
  +--------+
  | 166657 |
  +--------+
  1 row in set (2.47 sec)

  mysql>>  Query OK, 166904 rows affected (4.23 sec)
  Records: 166904  Duplicates: 0  Warnings: 0
  mysql>  select sql_no_cache count(b.PersonCode) as total from Art_Works b,Art_Person a force index (PersonCode) where b.PersonCode=a.PersonCode;
  +--------+
  | total  |
  +--------+
  | 166657 |
  +--------+
  1 row in set (0.44 sec)
  =====================下面是线上实验结果========================================
  mysql> desc select sql_no_cache count(*) as total from Art_Works b,Art_Person a force index (PersonCode) where b.PersonCode=a.PersonCode;
  +----+-------------+-------+-------+---------------+------------+---------+---------------------+--------+-------------+
  | id | select_type | table | type  | possible_keys | key        | key_len | ref                 | rows   | Extra       |
  +----+-------------+-------+-------+---------------+------------+---------+---------------------+--------+-------------+
  |  1 | SIMPLE      | b     | index | PersonCode    | PersonCode | 25      | NULL                | 173223 | Using index |
  |  1 | SIMPLE      | a     | ref   | PersonCode    | PersonCode | 24      | newart.b.PersonCode |     13 | Using index |
  +----+-------------+-------+-------+---------------+------------+---------+---------------------+--------+-------------+
  2 rows in set (0.00 sec)
  mysql>  alter table Art_Works add index idx_PU(PersonCode,PID);
  Query OK, 173223 rows affected (5.73 sec)
  Records: 173223  Duplicates: 0  Warnings: 0
  mysql> desc select sql_no_cache count(*) as total from Art_Works b,Art_Person a force index (PersonCode) where b.PersonCode=a.PersonCode;
  +----+-------------+-------+-------+-------------------+------------+---------+---------------------+------+--------------------------+
  | id | select_type | table | type  | possible_keys     | key        | key_len | ref                 | rows | Extra                    |
  +----+-------------+-------+-------+-------------------+------------+---------+---------------------+------+--------------------------+
  |  1 | SIMPLE      | a     | index | PersonCode        | PersonCode | 24      | NULL                | 8910 | Using index              |
  |  1 | SIMPLE      | b     | ref   | PersonCode,idx_PU | idx_PU     | 25      | newart.a.PersonCode |    1 | Using where; Using index |
  +----+-------------+-------+-------+-------------------+------------+---------+---------------------+------+--------------------------+
  2 rows in set (0.00 sec)


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-623974-1-1.html 上篇帖子: centos7下安装sql优化工具SQLAdvisor 下篇帖子: SQL字符串合并
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表