1 Tiaoooo 2024-08-22 22:52:41 +08:00 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 2024-08-22 22:57:48 +08:00 嫌加一张表太重,那就加一个字段,是就给个时间戳,否就给个 1000 以内的值,然后对该字段加索索引,离散度拉满,区分度拉满。 |
3 zf1968 OP 分区表会影响其他索引的效率吧 |
![]() | 4 106npo 2024-08-22 23:06:12 +08:00 via Android 被查询的值少加索引是可以的 |
![]() | 5 sagaxu 2024-08-22 23:08:12 +08:00 ![]() 是: 1 否: rand(-30000, 0) 离散度是不是一下子高了很多? 30000 不够那就 30000000 |
![]() | 6 lesismal 2024-08-22 23:18:05 +08:00 id 或者其他冗余字段, int64 或者 string, "是"则该字段为时间戳*10000 的 int64 或者对应的 string, "否"则是时间戳不加倍 查询"是"的时候查大于时间戳 10000 倍的位数的最小数值的范围 |
![]() | 7 lesismal 2024-08-22 23:18:29 +08:00 #6 该字段做索引 |
![]() | 8 lenmore 2024-08-22 23:31:49 +08:00 如果只查询 “是”,大胆的建索引吧,效率非常高。查询“否”,配合其他字段建组合索引,效率同样杠杠的。我们上亿的表都这么干,一点问题没有。 |
![]() | 9 salparadise 2024-08-22 23:44:38 +08:00 离散度太低不适合加索引 |
10 gary007lang 2024-08-22 23:55:08 +08:00 mysql8.0 的话,可以建立直方图 |
![]() | 11 zhouxiaoben 2024-08-22 23:57:24 +08:00 via Android 100 万数据对 mysql 来说小意思 |
![]() | 12 hangszhang 2024-08-23 00:10:37 +08:00 直接在这个字段上建索引就行 |
![]() | 13 wuyiccc 2024-08-23 09:00:22 +08:00 force index |
14 flyingfz 2024-08-23 09:42:05 +08:00 如果是 PG , PG 有 部分索引, 完美解决这个问题。 |
![]() | 15 zoharSoul 2024-08-23 10:12:37 +08:00 直接加索引就行 |
![]() | 16 me1onsoda 2024-08-23 10:18:41 +08:00 直接加索引啊,如果你要查否那可能有点麻烦 |
![]() | 17 xuanbg 2024-08-23 13:44:14 +08:00 直接加上索引就行,查“是”效率高的一批,查“否:就约等于没有索引了 |
![]() | 18 RandomJoke 2024-08-23 13:50:42 +08:00 100w 不用考虑这么多,啥都上索引肯定都行 |
![]() | 19 wenxueywx 2024-09-06 11:19:15 +08:00 这种字段肯定不会单独作为条件拿来查吧,建议和其他常用查询字段做联合索引。 #5 说的 是:1 否:rand (-30000 ,0 )的这种做法,离散度是高了,但并不能提升查询效率,即是走了索引,该扫描的行数也不会少,如果要回表,最坏的情况还可能导致一次全索引扫描+一次回表。这和使用 hint 强制走索引一样。 |