每个表上都有一个主键是否意味着我的表/数据库是;适当地;索引(MySQL)?

每个表上都有一个主键是否意味着我的表/数据库是;适当地;索引(MySQL)?,mysql,sql,indexing,Mysql,Sql,Indexing,在MySQL中,每个表上都有一个主键是否意味着我的表/数据库被“正确”索引 如果没有,我是否只需要将索引放在通常的joined字段和/或通常以where子句为目标的字段上 我经常听说我需要“正确地”索引我的数据库,并且理解索引的一个要点是限制查询需要进行的搜索。然而,我从未真正理解人们说“恰当”是什么意思。在阅读其他SO Q&A时,我意识到答案可能并不简单,但任何答案都会得到赞赏。不,主键不一定意味着表已正确索引(除非您只有非常简单的查询) 根据应用程序对表运行的查询设计索引 请参阅我的演示。索

在MySQL中,每个表上都有一个主键是否意味着我的表/数据库被“正确”索引

如果没有,我是否只需要将索引放在通常的
join
ed字段和/或通常以
where
子句为目标的字段上


我经常听说我需要“正确地”索引我的数据库,并且理解索引的一个要点是限制查询需要进行的搜索。然而,我从未真正理解人们说“恰当”是什么意思。在阅读其他SO Q&A时,我意识到答案可能并不简单,但任何答案都会得到赞赏。

不,主键不一定意味着表已正确索引(除非您只有非常简单的查询)

根据应用程序对表运行的查询设计索引


请参阅我的演示。

索引用于提高性能。您需要在任何地方创建索引,MySQL使用索引查找特定行比简单地扫描整个数据库要快,节省的时间对您来说意义重大。索引是有代价的:插入和更新的空间+额外时间。因此,你也需要考虑节省时间的好处是否足够大以证明成本。“适当”意味着什么对你的情况最好。在where子句中常用的索引字段是一个好主意。@DanBracuk有主键是否意味着我的表被索引了?这意味着它有一个这样的索引——是的,通常连接是基于一个表的主键包含在另一个表中;但这并不能保证足够。感谢您非常好的演示,我尝试实现pt查询摘要,但立即出现问题,即使“mysql slow.log”存在于所述位置且具有
777
权限:
$/usr/local/bin/pt query digest\/Applications/MNPP/tmp/mysql/mysql-slow.log\>~/pqd.txt
错误:
/Applications/MNPP/tmp/mysql/mysql-slow.log不存在或在/usr/local/bin/pt query digest第11435行不可读。在/usr/local/bin/pt query digest第11435行不存在或不可读。
您也可以读取stdin,例如
cat/Applications/MNPP/tmp/mysql/mysql-slow.log | pt query digest…
如果这不起作用,我会仔细检查日志文件的权限以及它所在的目录。您还可以运行
sudo pt query digest…
绕过权限。如下图所示的Ok
cat
位于pqd.txt文件中。但是,它并不像我在幻灯片中那样列出每个查询
root#cat/Applications/MNPP/tmp/mysql/mysql-slow.log |/Users/timperson/percona-toolkit-2.1.9/bin/pt-query-digest>~/pqd.txt
日志只包含执行时间超过秒的查询。默认的长查询时间为10秒。了解更多有关的信息。啊,好的,谢谢,我试图
设置全局long\u query\u time=0
,但它不允许我更改它,只保留了10秒。我想他们是在什么地方?另一方面,我可以更改
设置全局慢速\u query\u log=On
,所以不知道为什么会有差异。