mysql - 拥有最近帖子的用户将比拥有旧帖子的用户更快地返回结果
问题描述
用户 1 的帖子 ID:2,5,7,9
用户 2 的帖子 ID:600000、600020、600025、600033
我的表格帖子有 600050 行。
这就是问题所在,如果我想从用户 1 中选择帖子,则需要 15.+ 秒,如果我想从用户 2 中选择帖子,它将在 0,0005 完成。
我注意到拥有最近帖子的用户加载速度会更快。
用户 1:
select c.nome from posts p
join cadastro c on p.user=c.id
where (p.user in (1)) and p.delete='0'
//p.user in 1 - if I place to 2 it will get results much faster
group by p.id
order by p.id desc limit ?
我想从两者中更快地获得结果。不仅是用户 2。有什么想法吗?
CREATE TABLE IF NOT EXISTS `posts` (
`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`user` int(11) UNSIGNED NOT NULL,
`titulo` text,
`data` datetime NOT NULL,
`ip` varchar(20),
`delete` tinyint(1) NOT NULL DEFAULT '0'
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 ;
我试图在用户上添加索引,但没有任何改变。
解决方案
您在 上没有索引user
,因此每次都必须进行表扫描以查找帖子。这是大写B Bad,会削弱性能。修复它:
CREATE INDEX idx_user ON posts (user, `delete`);
然后您可以检查EXPLAIN
以确保它在您的查询中正确应用。
请注意,尽量避免使用MySQL 保留关键字,如DELETE
列名。类似“已删除”的内容也同样有效。
推荐阅读
- unity3d - unity2D 上的冒险游戏
- c++ - 使用 back_inserter 从结构的单个成员创建向量
- pymodbus - 如何写入pymodbus中的保持寄存器?
- ruby - 在 Ruby 中,如何判断两个方法或两个函数是否相同?
- javascript - 使用 React Native 进行 Azure Active Directory 身份验证
- android - 更新由以下机构管理的视图的“可聚焦”属性时 Android 发布 APK 错误:RNSVGSvgView
- reactjs - React i18next:两次调用 i18n.init 有缺点吗?
- asp.net-mvc - 我如何将字符串连接到 Kendo Ui Gridview 列
- magento - 清漆加 cloudflare
- node.js - 从 Angular 向 NodeJS 发送文件