数据库添加索引后查找数据为什么比不添加索引要快?
** 我发现mysql的group by 后面的字段没有严格要求,甚至select后面的字段可以不出现在group by后面**
我有一条sql ,不知道为什么会导致索引失效 SELECT dl.`user_type` AS userType, dl.`user_name` AS userName, dl.`phone` AS userPhone, pc.`name` AS courtName, dl.`build_unit` AS buildName, dl.`dev_name` AS deviceName, dl.`dev_no` AS deviceNo, dl.`create_time` AS openTime, dl.`status` FROM dev_device_log dl LEFT JOIN base_project_court pc ON dl.`court_id` = pc.`id` ORDER BY dl.`id` DESC LIMIT 0, 100; "image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20240926/28012c802300b314e575890140141289.png) 当我注释掉 select 后面的 pc."name" 字段就可以使用索引。 "image.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20240926/4a5cdeacfa993a8b267578ea5d27fdef.png) 不知道为什么,有没有大佬给我解惑一下。 测试环境中"dev_device_log"表中只有几百条数据的时候可以走索引,但是我从生产环境随意导出了几万条数据后就无法使用索引了。 不太理解为什么select 后面的字段会影响到索引情况 表结构: CREATE TABLE `base_project_court` ( `id` varchar(32) NOT NULL COMMENT '主键id', `community_id` varchar(32) NOT NULL COMMENT '项目id', `name` varchar(30) NOT NULL COMMENT '小区名', `py_name` varchar(120) NOT NULL COMMENT '拼音名', `logo` varchar(300) DEFAULT NULL COMMENT '小区图标', `address` varchar(255) DEFAULT NULL COMMENT '小区地址', `longitude` decimal(10,6) DEFAULT NULL COMMENT '经度(-180,180)', `latitude` decimal(9,6) DEFAULT NULL COMMENT '纬度(-90,90)', `status` char(1) NOT NULL DEFAULT '1' COMMENT '状态(1.启用 0.禁用)', `service_phone` varchar(20) DEFAULT NULL COMMENT '联系电话', `order_no` smallint(4) NOT NULL DEFAULT '1' COMMENT '排序', `del_flag` char(1) NOT NULL DEFAULT '0' COMMENT '是否删除', `create_user` varchar(32) NOT NULL COMMENT '创建人', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_user` varchar(32) NOT NULL COMMENT '更新人', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='项目小区'; CREATE TABLE `dev_device_log` ( `id` bigint(20) NOT NULL COMMENT 'id', `community_id` varchar(32) NOT NULL DEFAULT '' COMMENT '项目id', `court_id` varchar(32) NOT NULL DEFAULT '' COMMENT '小区id', `build_id` varchar(32) NOT NULL DEFAULT '' COMMENT '楼栋单元id', `build_unit` varchar(30) NOT NULL DEFAULT '' COMMENT '楼栋单元', `user_id` varchar(32) NOT NULL DEFAULT '' COMMENT '用户id', `user_name` varchar(32) NOT NULL DEFAULT '' COMMENT '用户名', `phone` varchar(15) NOT NULL DEFAULT '' COMMENT '手机号', `user_type` tinyint(2) NOT NULL DEFAULT '1' COMMENT '用户类型(1.住户 2.物业)', `device_id` varchar(32) NOT NULL DEFAULT '' COMMENT '设备id', `dev_name` varchar(32) NOT NULL DEFAULT '' COMMENT '门禁名称', `dev_no` varchar(10) NOT NULL DEFAULT '' COMMENT '设备编号', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态(1.成功 0.失败)', `failure_description` varchar(120) NOT NULL DEFAULT '' COMMENT '失败说明', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 我导出了一份几万条脱敏后的数据,但是不知道怎么传上来 我把sql传蓝奏云了,由于蓝奏云不支持上传.sql文件,我先压缩了一个zip包再上传 "sql文件" (https://link.segmentfault.com/?enc=LoeeP46UZaQrIuqK1hdrFw%3D%3D.pe0t9YkzwbhRj8Dglj%2FxWXXu5MhRBqNdwyJo5E%2B92EqLsHI8SSP7RDTUnc25BMRu)
"https://dev.mysql.com/doc/refman/8.4/en/" (https://link.segmentfault.com/?enc=cv22Ozrta3eU2uGCOjYH2Q%3D%3D.jkymh438p5iXskLYgNTWYCWnnpmDvi0VoRMKVcbiIL1WFLJZ0Jjh3j9xJ8flBYx%2B)这个应该就是mysql8.4的官方文档吧,为什么我看了半天没找到有关索引的内容,谁能告诉我在哪里啊?
这种情况下定期做索引重建,是一种很好的解决办法吗?