在varchar字段上建立索引时,必须指定索引长度,没必要对全字段建立索引,根据实际文本区分度决定索引长度 --《阿里开发手册》
CREATE TABLE my_user (
id BIGINT UNSIGNED,
user_name VARCHAR(50),
PRIMARY KEY (id)
)
INSERT INTO
my_user
VALUES
(1, "火萤, keep your fire"),
(2, "寒芒, 锋利的剑"),
(3, "皓月, 同一轮月与对你的思念"),
(4, "波光, 海边的慢时光"),
(5, "极光, 奇幻之境"),
(6, "黑耀, 能量内敛"),
(7, "恒星, 驱散阴霾"),
(8, "流星, 梦与幻想"),
(9, "落霞, 落幕"),
(10, "白雪, 寂静之地的审判"),
(11, "皓月, 梦与幻想"),
(12, "黑耀, 同一轮月与对你的思念"),
(13, "海边的慢时光, 恒星"),
(14, "极光,锋利的剑")
MySQL的LEFT()函数是一个字符串函数,它返回具有指定长度的字符串的左边部分。
LEFT(str, length);
两个参数的含义:
SELECT
COUNT(DISTINCT LEFT(user_name, 1)) / COUNT(*)
FROM
my_user
SQL说明: 截取user_name字段左边第一位,然后统计其去重后的数目(DISTINCT 去重),用该数目除以表中总数据量,得到区分度
区分度:0.7857
SELECT
COUNT(DISTINCT LEFT(user_name, 4)) / COUNT(*)
FROM
my_user
区分度:0.8571
索引长度 | 区分度 |
---|---|
1 | 0.7857 |
4 | 0.8571 |
“索引的长度与区分度是一对矛盾体,一般对字符串类型数据,长度为20的索引,区分度会高达90%” --《阿里开发手册》
eg:
CREATE INDEX 索引名 ON 表名 (列名(长度))