Php 是否应该在MySQL中使用/创建尽可能多的索引?

Php 是否应该在MySQL中使用/创建尽可能多的索引?,php,mysql,optimization,query-optimization,Php,Mysql,Optimization,Query Optimization,我意识到,当为“orderby”使用的列创建索引时,对MySQL查询的响应会快得多 现在我想知道应该创建哪些索引来优化请求时间。 例如,我经常使用以下查询: SELECT username FROM table WHERE registration_date > ".(time() - 10000)." SELECT username FROM table WHERE registration_date > ".(time() - 10000)." &

我意识到,当为“orderby”使用的列创建索引时,对MySQL查询的响应会快得多

现在我想知道应该创建哪些索引来优化请求时间。 例如,我经常使用以下查询:

SELECT username FROM table WHERE
    registration_date > ".(time() - 10000)."

SELECT username FROM table WHERE
    registration_date > ".(time() - 10000)."
    && status='active'

SELECT username FROM table WHERE
    status='active'

SELECT username FROM table ORDER BY registration_date DESC

SELECT username FROM table WHERE
    registration_date > ".(time() - 10000)."
    && status='active'
    ORDER BY birth_date DESC
问题1: 我是否应该为前三种请求类型设置单独的索引?(即,一个索引用于“注册日期”列,一个索引用于“状态”列,另一个索引用于两者的组合?)

问题2:
不同的索引是否分别用于“WHERE”和“ORDER BY”?比如说,我有一个用于“状态”和“注册日期”列的组合索引,另一个索引只用于“出生日期”列。我是否应该为这三列(“状态”、“注册日期”和“出生日期”)设置另一个组合索引?

在select语句上使用explain函数来确定连接速度减慢的位置(引用的行越多,速度越慢)。然后将索引应用于这些列

EXPLAIN SELECT * FROM table JOIN table 2 ON a = b WHERE conditions;

对select语句使用explain函数来确定连接的速度减慢的位置(引用的行越多,速度越慢)。然后将索引应用于这些列

EXPLAIN SELECT * FROM table JOIN table 2 ON a = b WHERE conditions;
引述:

[索引]将减慢更新和插入的速度

这是你必须计算的权衡。要优化表,应该只在最有可能应用条件的列中放置索引—索引越多,数据更改操作越慢。从这个意义上说,我个人并不认为创建组合索引有多大好处——如果你为3列创建了所有7种可能的索引排列,那么你的更新和插入肯定比只为3列使用3个索引更具阻力(甚至这也是有争议的)。另一方面,如果数据被编辑的次数比被编辑的次数少得多,那么索引确实可以帮助您加快速度

需要考虑的其他事项(再次引用上一页):

如果您的表非常小[…],那么使用索引比不使用索引而让它进行表扫描更糟糕。索引实际上只有在有很多行的表中才有用

引述:

[索引]将减慢更新和插入的速度

这是你必须计算的权衡。要优化表,应该只在最有可能应用条件的列中放置索引—索引越多,数据更改操作越慢。从这个意义上说,我个人并不认为创建组合索引有多大好处——如果你为3列创建了所有7种可能的索引排列,那么你的更新和插入肯定比只为3列使用3个索引更具阻力(甚至这也是有争议的)。另一方面,如果数据被编辑的次数比被编辑的次数少得多,那么索引确实可以帮助您加快速度

需要考虑的其他事项(再次引用上一页):

如果您的表非常小[…],那么使用索引比不使用索引而让它进行表扫描更糟糕。索引实际上只有在有很多行的表中才有用


是的,在您经常使用的列上设置索引是一个好主意,无论是ORDERBY还是where子句

但是要注意:如果你有索引,更新、插入和删除都会变慢

这是因为在这样的操作之后,索引也必须更新

因此,根据经验:如果您的应用程序是读密集型的,请在您认为有帮助的地方使用索引

如果您的应用程序经常更新数据,请小心,因为这可能会因为索引而变得缓慢

当你有疑问时,你必须简单地把手弄脏,然后研究解释的结果


是的,在您经常使用的列上设置索引是一个好主意,包括order by和where子句

但是要注意:如果你有索引,更新、插入和删除都会变慢

这是因为在这样的操作之后,索引也必须更新

因此,根据经验:如果您的应用程序是读密集型的,请在您认为有帮助的地方使用索引

如果您的应用程序经常更新数据,请小心,因为这可能会因为索引而变得缓慢

当你有疑问时,你必须简单地把手弄脏,然后研究解释的结果


对于前两个示例,您可以使用一个索引来满足它们:{registration\u date,status}。这样的索引可以在第一个项目(注册日期)上支持过滤器,也可以在两个项目上都支持过滤器

然而,这并不仅仅适用于地位。关于地位的问题是地位的选择性如何。也就是说,有多大比例的记录具有status=“active”。如果这是一个很高的比例(因此,平均而言,每个数据库页面都会有一个活动记录),那么索引可能没有多大帮助


订货人的要求更为棘手。我不知道mysql是否为此使用索引。通常,使用索引对整个记录进行排序比仅对记录进行排序效率低。使用索引会导致对页面中记录的随机访问模式,这可能会导致大于页面缓存的表出现重大性能问题。

对于前两个示例,您可以使用一个索引来满足它们:{registration\u date,status}。这样的索引可以在第一个项目(注册日期)上支持过滤器,也可以在两个项目上都支持过滤器

然而,这并不仅仅适用于地位。关于地位的问题是地位的选择性如何。也就是说,有多大比例的记录具有status=“active”。如果这是一个很高的比例(因此,平均而言,每个数据库页面都会有一个活动记录),那么索引可能没有多大帮助

订货人的要求更为棘手。我