|
|
1
1
使用 explain mysql中的命令将提供很多关于mysql正在做什么以及如何优化查询的信息。 在q1和q2中:一个索引(a.type,所有其他a cols)和一个索引(b.type,所有其他b cols) 在第三季度:一个索引(A.B_类型,所有其他A列)和一个索引(品牌,类型) 理想情况下,您希望所有选中的列都直接存储在索引中,这样mysql就不必从索引跳回表数据来获取选中的列。但是,这并不总是可管理的(即:有时需要选择*并且索引所有列的成本太高),在这种情况下,仅索引搜索列是可以的。 所以你所说的一切都很好。 |
|
|
2
1
查询3无效,但我想您的意思是
查询1与查询2相同,只是语法更好,两者可能都有相同的查询计划,并且都将使用这两个索引。 查询3将使用b.brand上的索引,但不使用其类型部分。如果您有.type的索引,它也将使用该索引。 你说得对,它们应该是散列索引。 |
|
|
3
1
如果brand=5的b的数目接近于零,查询3可以使用a.type上的索引 如果query2是b树(因此被排序),那么它将使用索引。将哈希索引与索引联接一起使用可能会减慢查询速度(因为必须以非顺序方式读取大小(a)值) |
|
|
4
1
查询优化和索引是一个庞大的主题,因此您肯定想了解mysql和您正在使用的特定存储引擎。innodb和ndb支持“using hash”;我不认为myisam支持它。 即使联接条件是相等的,您拥有的联接也将执行完整表或索引扫描;因为没有where子句,所以必须读取每一行。 使用标准的b树索引可能会更好,但是要测量它并使用“explain”调查查询计划。mysql innodb存储按主键组织的行数据,因此表上也应该有主键,而不仅仅是索引。最好可以在连接中使用主键,否则mysql将从索引中检索主键,然后执行另一次提取以获取行。该规则的一个很好的例外是,如果辅助索引包含查询中所需的所有列。这称为覆盖索引,mysql根本不需要查找行。 |
|
|
Bard.Mus · 迁移后的数据库字符集环境 1 年前 |
|
Efannnnnn · 将Id数据存储到任何页面 1 年前 |
|
|
yooooo · 用于在块中删除的存储过程-LOOP未执行 1 年前 |
|
John Beasley · 更新一定数量记录的连续日期 1 年前 |
|
|
ColinM · MySQL以前的结果查询返回不正确的值 1 年前 |
|
Sergey_Z · MySQL只需无条件连接2个表和交叉连接 1 年前 |