MySQL:高性能索引


prtyaa
prtyaa 2023-12-28 15:46:35 50969 赞同 0 反对 0
分类: 资源
索引的优点: 1、大大减少了服务器需要扫描的数据量 2、帮助服务器避免排序和临时表 3、可以将随机IO变为顺序IO

独立的列,索引上不要有表达式计算和函数操作

where id+1 = 5; 或者 where TO_DAYS(date) -TO_DAYS(date1) <10

如果需要索引很长的字符列,那么不如只索引这个字符串的前几个字符

使用select count (*) as cnt ,LEFT(name,3)as pref from table group by pref order by cnt limit 10;这样的语句来看分布,如果显示的cnt数量太多,那就加大LFET(name,7)直到合适为止,假如7这个数字合适,那么就创建索引:

alter table table add key (name(7));不过group by 和 order by都不支持这种索引,也无法使用这种索引做覆盖扫描。

选择合适的索引列顺序

将选择性最高的列放在放到索引最前列,一个字段sex,选择性就两个,一个男,一个女,即使查询出来结果集也是很多的,尽量把选择性多的列放在前面,比如县的名字,这样比sex好的多了,因为我国有很多县,就是县这个字段区分度大,sex区分度太小了。这样的话where语句就可以过滤出需要的行数据了。例如下列的查询语句:

select * from t where staff_id = 2 and customer_id = 584;

针对这个语句的索引如何建立呢?

首先 select SUM(staff_id = 2),SUM(customer_id = 584) from t;

假如结果是 SUM(staff_id = 2)=7992 , SUM(customer_id = 584)=30

那么就应该将索引列 customer_id,放在组合索引(customer_id,staff_id)的第一个位置,先筛选符合条件的30个,然后再从这30个里筛选符合条件的 staff_id ,比先筛选符合条件的7992个,再从这7992个里筛选符合条件的customer_id ,性能要高的多。

但是这样的查询结果依赖具体的数字,比如上面例子中的 2 和 584。正确的做法是:

select count(distinct staff_id) / count(*) as X,count(distinct customer_id) / count(*) as Y,count(*), from table。

结果是: X:0.0001 Y:0.0373 count(*):16049

这样看下来刚才选择的 customer_id 是明智的选择

如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!

评价 0 条
prtyaaL2
粉丝 1 资源 1949 + 关注 私信
最近热门资源
银河麒麟桌面操作系统备份用户数据  126
统信桌面专业版【全盘安装UOS系统】介绍  121
银河麒麟桌面操作系统安装佳能打印机驱动方法  114
银河麒麟桌面操作系统 V10-SP1用户密码修改  105
最近下载排行榜
银河麒麟桌面操作系统备份用户数据 0
统信桌面专业版【全盘安装UOS系统】介绍 0
银河麒麟桌面操作系统安装佳能打印机驱动方法 0
银河麒麟桌面操作系统 V10-SP1用户密码修改 0
作者收入月榜
1

prtyaa 收益393.62元

2

zlj141319 收益218元

3

1843880570 收益214.2元

4

IT-feng 收益209.03元

5

风晓 收益208.24元

6

777 收益172.71元

7

Fhawking 收益106.6元

8

信创来了 收益105.84元

9

克里斯蒂亚诺诺 收益91.08元

10

技术-小陈 收益79.5元

请使用微信扫码

加入交流群

请使用微信扫一扫!