我正在开发一个拥有一个包含2100万条记录的表的数据库。创建数据库并且不再有插入,更新或删除操作时,将加载一次数据。 Web应用程序访问数据库以生成select语句。
每个请求服务器目前需要25秒才能收到响应。但是,如果多个客户端同时发出请求,则响应时间会显着增加。有没有办法加速这个过程?
我正在使用MyISAM而不是具有固定最大行的InnoDB,并根据搜索的字段编制索引。
答案 0 :(得分:0)
如果没有更新/插入/删除数据,那么您可能希望告诉数据库在您阅读时不要锁定该表。
对于MYSQL,这似乎是:
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
SELECT * FROM TABLE_NAME ;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ ;
(参考:http://itecsoftware.com/with-nolock-table-hint-equivalent-for-mysql)
更多阅读文档,如果它有帮助:
https://dev.mysql.com/doc/refman/5.7/en/innodb-transaction-isolation-levels.html
如果你需要进一步谷歌,可能有用的TSQL等价物是
SELECT * FROM TABLE WITH (nolock)
这可以提高性能。正如其他评论中所指出的那样,一些好的索引可能会有所帮助,并且可能会进一步打破表格(如果可能的话)以扩展内容,以便在不需要时不访问所有数据。
作为一个说明;锁定表会阻止其他人在您使用它时更改数据。不锁定具有大量插入/删除/更新的表可能会导致您的选择返回相同数据的多行(因为它在硬盘上移动),缺少列的行等等。
由于你有一个表,你选择反对你的请求都是轮流锁定和解锁表。如果您没有进行更新,插入或删除,那么您的数据不应该更改,因此您可以放弃锁定。