搜索
房产
装修
汽车
婚嫁
健康
理财
旅游
美食
跳蚤
二手房
租房
招聘
二手车
教育
茶座
我要买房
买东西
装修家居
交友
职场
生活
网购
亲子
情感
龙城车友
找美食
谈婚论嫁
美女
兴趣
八卦
宠物
手机

mysql索引创建和使用细节

[复制链接]
查看: 54|回复: 0

1万

主题

1万

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
32643
发表于 2020-1-15 03:28 | 显示全部楼层 |阅读模式
近来困扰自己很久的膝盖积液手术终究做完,在野生伤,逛技术博客看到easyswoole斥地组成员仙士可博客有关mysql索引方面的常识,自己筹划重温下。
一般营业起步数据表数据量较少,不用考虑利用索引,当前期积累的数据数目很是可观时,利用索引是提拔查询的一条路子,其他的像表分区,分库分表等等。

【索引建立】

索引的建立需要考虑被建立索引的字段区分度,比如一张表里面有渠道channel,渠道可期品种不超出3种,win系,安卓系,iOS系,而数据表数据量有一百万,均匀下来每个渠道各是1/3也就是33万数据,这样的数据量就能否基于channel 索引区分都不会太大。
可是假如基于date字段做索引,如20200114,一年一百万,除以365天,均匀下来天天300条数据。这个区分度是相当大。
一样的索引利用 33w数据查询明显服从低于300条数据。
索引可以加速mysql办事查询速度,但不是索引越多越好,由于数据insert或update的时候,寄存索引的文件一样需要举行更新,这里会拖慢数据插入更新的速度,假如对数据实时性有要求的,无疑会受影响。

【索引利用】

组合索引:组合索引是有多个字段团结查询利用的索引,依照从左到右依次婚配的原则

【索引生效】

sql拼写字段不是依照组合索引从左至右原则;
索引字段是字符串典范,sql拼接利用整型。以下:
  1. MySQL [test_db]> show create table test_users\G;*************************** 1. row ***************************       Table: test_usersCreate Table: CREATE TABLE `test_users` (  `uid` int(11) unsigned NOT NULL AUTO_INCREMENT,  `username` char(15) NOT NULL,  `created_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,  `user_id` char(11) NOT NULL DEFAULT '0',  PRIMARY KEY (`uid`),  KEY `testindex` (`user_id`)) ENGINE=InnoDB AUTO_INCREMENT=1306001 DEFAULT CHARSET=utf8mb41 row in set (0.04 sec)
复制代码
MySQL [test_db]> explain select * from test_users where user_id ='1273656';
+----+-------------+------------+------------+------+---------------+-----------+---------+-------+------+----------+-------+
| id | select_type | table      | partitions | type | possible_keys | key       | key_len | ref   | rows | filtered | Extra |
+----+-------------+------------+------------+------+---------------+-----------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | test_users | NULL       | ref  | testindex     | testindex | 44      | const |    1 |   100.00 | NULL  |
+----+-------------+------------+------------+------+---------------+-----------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.05 sec)
MySQL [test_db]> explain select * from test_users where user_id =1273656;
+----+-------------+------------+------------+------+---------------+------+---------+------+--------+----------+-------------+
| id | select_type | table      | partitions | type | possible_keys | key  | key_len | ref  | rows   | filtered | Extra       |
+----+-------------+------------+------------+------+---------------+------+---------+------+--------+----------+-------------+
|  1 | SIMPLE      | test_users | NULL       | ALL  | testindex     | NULL | NULL    | NULL | 306078 |    10.00 | Using where |
+----+-------------+------------+------------+------+---------------+------+---------+------+--------+----------+-------------+
1 row in set, 3 warnings (0.04 sec)
可以发现第一条sql的 type = ref,key = testindex,第二条sql的 type = ALL,key = null也就是没用到任何索引而是全文扫描
未完待续...



     

免责声明:假如加害了您的权益,请联系站长,我们会实时删除侵权内容,感谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2006-2014 全椒百姓网-全椒知名**,发布及时新鲜的全椒新闻资讯 生活信息 版权所有 法律顾问:高律师 客服电话:0791-88289918
技术支持:迪恩网络科技公司  Powered by Discuz! X3.2
快速回复 返回顶部 返回列表