- 首页 > 资讯 > 科技 > >
索引|一文带你你搞懂索引如何优化( 四 )
第一种情况是表记录比较少 , 例如一两千条甚至只有几百条记录的表 , 没必要建索引 , 让查询做全表扫描就好了 。 至于多少条记录才算多 , 这个个人有个人的看法 , 我个人的经验是以2000作为分界线 , 记录数不超过 2000可以考虑不建索引 , 超过2000条可以酌情考虑索引 。 另一种不建议建索引的情况是索引的选择性较低 。 所谓索引的选择性(Selectivity) , 是指不重复的索引值(也叫基数 , Cardinality)与表记录数(#T)的比值: IndexSelectivity = Cardinality / #T - 显然选择性的取值范围为(0, 1]`` , 选择性越高的索引价值越大 , 这是由B+Tree的性质决定的 。 例如 , employees.titles表 , 如果title`字段经常被单独查询 , 是否需要建索引 , 我们看一下它的选择性:
SELECT count(DISTINCT(title))/count(*) ASSelectivity FROMemployees.titles+-------------+| Selectivity |+-------------+|0.0000 |+-------------+ - title的选择性不足0.0001(精确值为0.00001579) , 所以实在没有什么必要为其单独建索引 。
- 有一种与索引选择性有关的索引优化策略叫做前缀索引 , 就是用列的前缀代替整个列作为索引key , 当前缀长度合适时 , 可以做到既使得前缀索引的选择性接近全列索引 , 同时因为索引key变短而减少了索引文件的大小和维护开销 。 下面以employees.employees表为例介绍前缀索引的选择和使用 。
- 假设employees表只有一个索引 , 那么如果我们想按名字搜索一个人 , 就只能全表扫描了:
EXPLAIN SELECT * FROM employees.employees WHERE first_name="Eric"AND last_name="Anido"+----+-------------+-----------+------+---------------+------+---------+------+--------+-------------+| id |select_type | table|type | possible_keys |key| key_len |ref| rows|Extra|+----+-------------+-----------+------+---------------+------+---------+------+--------+-------------+|1 | SIMPLE|employees | ALL|NULL| NULL |NULL| NULL | 300024 | Using where |+----+-------------+-----------+------+---------------+------+---------+------+--------+-------------+ - 如果频繁按名字搜索员工 , 这样显然效率很低 , 因此我们可以考虑建索引 。 有两种选择 , 建或<first_name, last_name> , 看下两个索引的选择性:
SELECT count(DISTINCT(first_name))/count(*) ASSelectivity FROMemployees.employees+-------------+| Selectivity |+-------------+|0.0042 |+-------------+SELECT count(DISTINCT(concat(first_name, last_name)))/count(*) AS Selectivity FROM employees.employees+-------------+| Selectivity |+-------------+|0.9313 |+-------------+ - 显然选择性太低 , ``<first_name, last_name>选择性很好 , 但是first_name和last_name加起来长度为30 , 有没有兼顾长度和选择性的办法?可以考虑用first_name和last_name的前几个字符建立索引 , 例如<first_name, left(last_name, 3)>` , 看看其选择性:
SELECT count(DISTINCT(concat(first_name, left(last_name, 3))))/count(*) ASSelectivity FROMemployees.employees+-------------+| Selectivity |+-------------+|0.7879 |+-------------+ - 选择性还不错 , 但离0.9313还是有点距离 , 那么把last_name前缀加到4:
SELECT count(DISTINCT(concat(first_name, left(last_name, 4))))/count(*) ASSelectivity FROMemployees.employees+-------------+| Selectivity |+-------------+|0.9007 |+-------------+
推荐阅读
-
北京字节跳动科技|字节跳动再被施压,白宫经济顾问预计TikTok将在美独立运营
-
-
-
-
-
「湖北」京东“买光湖北货”战报:二线市场成交额增长108%
-
穿越火线|揭幕战:BS.F第一次线下太过紧张,LGD.Y双狙值得期待
-
燕窝胶原蛋白肽什么时候喝效果最好,碧纤芙燕窝胶原蛋白肽怎么样?
-
修建明堂|中国古代最高的礼制建筑,使用权专属于皇帝一人,现今已经失传了
-
『潮汐』北京:清明小长假期间,高速路将重现“潮汐车流”
-
「法国」迪士尼高管Kevin Mayer辞职,将担任TikTok首席执行官
-
济宁嘉众网络科技|视频彩铃是不是短视频发展的下一个行业风口
-
「娱号」九任丈夫相继而亡,却还有男人抢着要!,中国史上第一黑寡妇
-
美剧|HBO黄暴古战争美剧:黄暴美剧代表作,尺度超大,和斯巴达齐名
-
华为出人意料!即便芯片断供,手机业务暂停,华为也能东山再起
-
游击队冲锋|成千上万民众点赞,华春莹火速发声回应,“中国”突然登美国热搜
-
在没有发生疫情的城市,对小区住户进行封门是不是合理合法
-
苹果手机三千价位手机怎么选,大数据分析出了这四款,真准
-
不二历史汇@韩国健身教练,生活中软萌可爱,健身时画风突变化身肌肉女
-
『家电论坛』CANTON Movie265,小身材中的“大”不同