从数据库表中增加“选择”的方法是8.000.000行?

时间:2017-07-17 09:44:14

标签: php mysql sql database performance

Hellow,wrold!

我在网上看过这个,但我找不到合适的解决方案。我不是sql中的专家,我有最简单的表,其中包含10列,8.000.000行和最简单的查询(我正在使用php)

SELECT `field_name_1`, `field_name_2`, `field_name_3`
FROM `table_name`
WHERE `some_field`=#here_is_an_integer#
ORDER BY `some_field`
LIMIT 10;

可能是某些索引,缓存或类似的内容。

如果你有一些想法,我会很高兴你帮助或只是说我应该遵循的方式来找到解决方案。

谢谢!

3 个答案:

答案 0 :(得分:4)

some_field上使用索引,并以最佳方式在使用SQL WHERE的所有列上使用索引。 如果您只想显示数据,请使用LIMIT在Sql上使用分页 就像Admin设置缓存和其他Mysql(或MariaDB)限制更好的搜索一样(Top 20+ MySQL Best Practices

...简单的答案,如果你有空位,来自
的MySQL> ALTER TABLE table_name ADD INDEX(some_field);

答案 1 :(得分:1)

以下是需要考虑的事项:

  • 确保所有要加入的字段,WHERE或ORDER / GROUP BY都有适当的索引(唯一或纯文本)
  • 如果表中有许多行,则服务器的内存缓存必须能够存储临时结果集。
  • 使用InnoDb进行较慢的插入和更快的选择,并调整InnoDb以便能够存储临时结果集
  • 不要使用RAND(),以便可以对结果集进行查询缓存。
  • 过早过滤;尝试在JOIN上设置条件.. AND x = y,而不是在最终的WHERE条件上(当然除非它是关于主表)。 (内部)以最佳顺序加入;例如,如果你有很多用户和很少的报告,首先选择用户,在进行其他连接之前立即限制行数。

答案 2 :(得分:0)

也许你可以更好地形式化你的问题(可能在某处使用问号)。

无论如何,如果你想提高单个表上select的速度,比如你描述的那个表,那么至少WHERE子句中涉及的列应该有一个合适的索引。如果它是整数类型,这可能只是标准的'KEY(some_field)',否则如果它是一个字符串(即varchar或varbinary)类型字段,在第一个 n中具有合理的基数字节,您可以使用前缀索引并执行类似'KEY({{1}}(8))'的操作,并最小化索引大小(随后通过减少btree搜索时间来提高性能)。

理想情况下,服务器将具有足够的ram(并且如果使用innodb,则具有足够大的innodb_buffer_pool_size)以将上述索引保留在内存中。另请查看https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_adaptive_hash_index ...如果您的服务器具有可用资源,并且您的应用程序具有数据访问模式以证明其合理性。

希望这有帮助!