1
Tiaoooo 130 天前 via Android
试一下分区后加索引呢
以下内容来自 ai: -- 假设我们有一个名为 'user_activities' 的表 CREATE TABLE user_activities ( id INT AUTO_INCREMENT, user_id INT, activity_type VARCHAR(50), status ENUM('是', '否'), created_at TIMESTAMP, PRIMARY KEY (id, status) ) ENGINE=InnoDB; -- 按 status 列进行分区 ALTER TABLE user_activities PARTITION BY LIST COLUMNS(status) ( PARTITION p_yes VALUES IN ('是'), PARTITION p_no VALUES IN ('否') ); -- 插入一些示例数据 INSERT INTO user_activities (user_id, activity_type, status, created_at) VALUES (1, '登录', '是', NOW()), (2, '购买', '否', NOW()), (3, '评论', '是', NOW()), (4, '浏览', '否', NOW()); -- 查询 status 为 '是' 的记录 EXPLAIN SELECT * FROM user_activities WHERE status = '是'; -- 添加索引以进一步优化查询 CREATE INDEX idx_status_created_at ON user_activities(status, created_at); -- 再次解释查询计划 EXPLAIN SELECT * FROM user_activities WHERE status = '是' ORDER BY created_at DESC LIMIT 10; -- 查看分区信息 SELECT PARTITION_NAME, TABLE_ROWS, AVG_ROW_LENGTH, DATA_LENGTH FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'user_activities'; |
2
awalkingman 130 天前
嫌加一张表太重,那就加一个字段,是就给个时间戳,否就给个 1000 以内的值,然后对该字段加索索引,离散度拉满,区分度拉满。
|
3
zf1968 OP 分区表会影响其他索引的效率吧
|
4
xmumiffy 130 天前 via Android
被查询的值少加索引是可以的
|
5
sagaxu 130 天前 2
是: 1
否: rand(-30000, 0) 离散度是不是一下子高了很多? 30000 不够那就 30000000 |
6
lesismal 130 天前
id 或者其他冗余字段, int64 或者 string, "是"则该字段为时间戳*10000 的 int64 或者对应的 string, "否"则是时间戳不加倍
查询"是"的时候查大于时间戳 10000 倍的位数的最小数值的范围 |
7
lesismal 130 天前
#6 该字段做索引
|
8
lenmore 130 天前
如果只查询 “是”,大胆的建索引吧,效率非常高。查询“否”,配合其他字段建组合索引,效率同样杠杠的。我们上亿的表都这么干,一点问题没有。
|
9
salparadise 130 天前
离散度太低不适合加索引
|
10
gary007lang 130 天前
mysql8.0 的话,可以建立直方图
|
11
zhouxiaoben 130 天前 via Android
100 万数据对 mysql 来说小意思
|
12
hangszhang 130 天前
直接在这个字段上建索引就行
|
13
wuyiccc 129 天前
force index
|
14
flyingfz 129 天前
如果是 PG , PG 有 部分索引, 完美解决这个问题。
|
15
zoharSoul 129 天前
直接加索引就行
|
16
me1onsoda 129 天前
直接加索引啊,如果你要查否那可能有点麻烦
|
17
xuanbg 129 天前
直接加上索引就行,查“是”效率高的一批,查“否:就约等于没有索引了
|
18
RandomJoke 129 天前
100w 不用考虑这么多,啥都上索引肯定都行
|
19
wenxueywx 115 天前
这种字段肯定不会单独作为条件拿来查吧,建议和其他常用查询字段做联合索引。
#5 说的 是:1 否:rand (-30000 ,0 )的这种做法,离散度是高了,但并不能提升查询效率,即是走了索引,该扫描的行数也不会少,如果要回表,最坏的情况还可能导致一次全索引扫描+一次回表。这和使用 hint 强制走索引一样。 |