MySQL创建前缀索引和索引选择性

“天忽作晴山捲慢,云犹含态石披衣”
什么是前缀索引: 一般情况下,如果需要作为索引的那一列长度很长.就需要使用前缀索引来节约索引控件.即只需要为前面几个字符作为索引.
什么是索引选择性: 索引选择性是指,不重复的索引值(也称为基数)和数据表的记录总数(#T)的比值,范围从1/#T到1之间.索引选择性越高则查询效率越高,因为选择性高的索引可以让MySQL在查找时过滤掉更多的行.唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的.
举个例子说明:这里有一张测试表(只截图其中一列,该列待会要用到),如下:
这里写图片描述
写个简单的查询:用时0.111秒(这是没有加前缀索引的结果)
这里写图片描述
下面开始给表加前缀索引:
计算索引前缀的诀窍在于要选择足够长的前缀以保证较好的选择性,同时又不能太长(以便节约空间),前缀应该足够长,以使得前缀索引的选择性接近于索引整个列.话句话说,前缀的”基数”应该接近于完整列的”基数”.
计算完整列的基数:

select COUNT(DISTINCT id_address)/COUNT(*) from tabelName;

这里写图片描述
我这里的结果为0.7864
接下来计算最接近完整列的基数:

select COUNT(DISTINCT LEFT(id_address,3))/COUNT(*) as sel3,
COUNT(DISTINCT LEFT(id_address,4))/COUNT(*) as sel4,
COUNT(DISTINCT LEFT(id_address,5))/COUNT(*) as sel5,
COUNT(DISTINCT LEFT(id_address,6))/COUNT(*) as sel6,
COUNT(DISTINCT LEFT(id_address,7))/COUNT(*) as sel7,
COUNT(DISTINCT LEFT(id_address,8))/COUNT(*) as sel8,
COUNT(DISTINCT LEFT(id_address,22))/COUNT(*) as sel22,
COUNT(DISTINCT LEFT(id_address,23))/COUNT(*) as sel23,
COUNT(DISTINCT LEFT(id_address,24))/COUNT(*) as sel24,
COUNT(DISTINCT LEFT(id_address,25))/COUNT(*) as sel25
 from tableName;

这里写图片描述
这里算出当前缀为25时,该基数等于完整列的基数.
接下来建立长度为25的前缀索引.

alter table tableName add key (id_address(25));

建立完成之后,再来执行刚才耗时0.111秒的语句,看耗时多少.
这里写图片描述
这次只耗时0.037秒..可以看出前缀索引的效果.

刚才的前缀索引是通过算出来的最佳值(长度为25).这次我们来试一下随机值.设置前缀索引长度为15;

alter table tableName add key (id_address(15));

再来看下查询耗时多少.
这里写图片描述
这次用时0.044秒.由此可见索引县选择性的重要性.

### 回答1: 在 MySQL创建前缀索引可以使用以下语句: ``` CREATE INDEX index_name ON table_name (column_name(length)); ``` 其中,index_name 是索引的名称,table_name 是的名称,column_name 是要创建索引,length 是前缀长度。 例如,在名为 "customers" 的创建名为 "name_index" 的前缀索引,并且前缀长度为 10,可以使用以下语句: ``` CREATE INDEX name_index ON customers (name(10)); ``` 注意,前缀索引只对 VARCHAR 或 CHAR 类型的有效 ### 回答2: 在MySQL创建前缀索引的方法如下: 首先,选择需要创建前缀索引。假设我们要在名为"users"的中的"username"创建前缀索引。 接下来,我们使用以下语法创建前缀索引: ALTER TABLE users ADD INDEX prefix_username (username(5)); 在上述语法中,"username(5)"示我们要对"username"的前5个字符创建索引。你可以根据实际需要选择合适的前缀长度。 创建索引后,MySQL将使用该索引来加快对该的检索速度。但要注意,使用前缀索引可能会导致查询结果的准确性下降。例如,如果我们使用前缀索引来进行模糊搜索,那么可能会返回一些不符合我们想要的结果。 此外,还可以使用多前缀索引。例如,我们在"users"的"username""email"创建一个多前缀索引,可以使用以下语法: ALTER TABLE users ADD INDEX prefix_username_email (username(5), email(10)); 在上述语法中,我们为"username"选择了前缀长度为5的索引,为"email"选择了前缀长度为10的索引。 需要注意的是,使用前缀索引可以加快查询的速度,但也会增加索引的大小。因此,我们应该根据实际需求性能要求来选择合适的前缀长度。如果前缀长度过长,会导致索引的大小增加,从而影响查询的效率。 总而言之,通过在MySQL创建前缀索引,我们可以加快对指定的检索速度,提高数据库的性能。但在使用前缀索引时需要注意权衡查询结果的准确性索引大小对性能的影响。 ### 回答3: 在MySQL创建前缀索引可以提高查询效率减少索引占用的存储空间。前缀索引是指只使用值的前缀部分作为索引,而不是使用完整的值。下面是创建前缀索引的步骤: 1. 使用CREATE INDEX语句创建前缀索引。语法如下: CREATE INDEX 索引名 ON 名 (名 (前缀长度)); 2. 索引名可自定义,名是要创建索引名,名是要创建索引名,前缀长度是指要作为索引值的前缀长度。 3. 例如,如果要为名为“students”的“name”创建前缀索引,只使用姓名的前3个字符作为索引,可以使用以下语句: CREATE INDEX idx_name ON students(name(3)); 4. 前缀长度的选择应根据具体情况。较短的前缀长度可以减少索引的存储空间,但可能引起查询结果的不准确。较长的前缀长度可以更准确地匹配查询条件,但会增加索引的存储空间。 5. 创建前缀索引后,可以使用EXPLAIN语句验证索引是否被使用。例如,使用以下语句查询“students”中“name”以“J”开头的记录: EXPLAIN SELECT * FROM students WHERE name LIKE 'J%'; 如果索引被使用,查询计划中会显示“Using index”或“Using index condition”。 需要注意的是,前缀索引可能会导致索引选择的不准确性,因此在创建前缀索引时需要谨慎考虑,确保索引的覆盖范围不会过于广泛,以免导致查询结果的不准确。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值