我有一个ip-to-country查找表.此表每月更新一次,同时非常频繁地阅读.我现在把它作为innodb.这是一个几乎只能从中读取的表的最佳表类型?
提前致谢.
我有一个基于PHP和MySQL的在线游戏(PHP 5.2.9和MySQL 5.0.91).最近我遇到的问题是,当我在表中删除数千行旧数据时,整个站点有时会冻结.当查询必须等待我假设的表锁并且游戏无法按预期运行时,我也遇到了奇怪的事情发生的问题.
我的所有表都是MyISAM,每秒运行900多个查询.在整个数据库(约150个表)中,88%的查询是读取,只有12%的写入,但是一些表更接近50/50并且每秒从各种客户端读取和写入大量数据(这是一个多人游戏).这些表还可存储1M-5M行.
我知道MyISAM应该读得更快,但InnoDB不必在写入时锁定整个表.我在这里和其他网站上经历了很多主题,但我仍然不确定如何解决这些问题.
可能重复:
MyISAM与InnoDB
好的,我读过维基百科和InnoDB的这些信息似乎更好.这是我的问题是否可以使用InnoDB而不是MyISAM从数据库中选择用户数据?或者与MyISAM保持联系会更好.
如果我要改为Inno PDO仍然可以使用它和一些旧式查询?
$q = ("SELECT * ... );
$r = mysql_query($q);
Run Code Online (Sandbox Code Playgroud) 我有一张桌子,每秒可以接收大约50个插页.现在有700k记录,使用160 MiB.我的小VPS与1公斤的公羊正在跟上,但几乎没有.
我之所以选择InnoDB,就像人们说"它扩展得更好",不那么频繁地腐败并实现行锁定而不是表锁定.
但这是正确的选择吗?
我也读过MyISAM支持延迟插入,这可能非常有趣.(我想知道表锁定的权衡取舍)
我的MySQL数据库中有两个表,用户和推文,如下所示:
TABLE users (
uid int(7) NOT NULL AUTO_INCREMENT,
twitter_uid int(10) NOT NULL,
screen_name varchar(255) NOT NULL,
`name` varchar(255) NOT NULL,
tweets int(6) NOT NULL,
followers_count int(7) NOT NULL,
statuses_count int(7) NOT NULL,
created_at int(10) NOT NULL,
PRIMARY KEY (uid)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
TABLE tweets (
tweet_id int(11) NOT NULL AUTO_INCREMENT,
`query` varchar(5) NOT NULL,
id_str varchar(18) NOT NULL,
created_at int(10) NOT NULL,
from_user_id int(11) NOT NULL,
from_user varchar(256) NOT NULL,
`text` text NOT NULL,
PRIMARY KEY (tweet_id),
KEY …Run Code Online (Sandbox Code Playgroud) 我有一张非常简单的桌子
CREATE TABLE IF NOT EXISTS `largecache` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`tooltip` varchar(255) NOT NULL,
`name` varchar(100) NOT NULL,
`attributes` text NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `tooltip` (`tooltip`)
) ENGINE=InnoDB
Run Code Online (Sandbox Code Playgroud)
大约有800万个条目几乎完全用于读取.我正在努力确保尽快访问数据.我目前正在使用InnoDB,是否值得切换到MyISAM?我唯一关心的是读取性能.此外,我可以使用任何其他建议加速,因为数据库读取几乎是我应用程序中唯一的瓶颈.
我正在使用MySQL客户端版本:5.1.47
谢谢.
[编辑:更多细节]我正在使用php,我正在查询基于工具提示字段的完全匹配.它被托管在一个共享的VPS上,有1个内存,我可以尝试对mysql进行任何调整,但我知道mysql调整是一个非常复杂的问题.
示例查询:
select * from largecache where `tooltip` = "Cm8IuIyq9QMSBwgEFS0iGWAd30SUNR2EHJ0nHYYCY-odxZ6okR0pEnPgHWzQbvIiCwgBFXZCAwAYCCAiMAk4_gNAAEgPUBBg_gNqJQoMCAAQvKHZ5oCAgIA6EhUIrcC1xggSBwgEFUn1i18wCTgAQAEY2ojJgQxQAlgA"
Run Code Online (Sandbox Code Playgroud)
我确实安装了APC,但没有安装memcached
数据库已有多达25-30个表,所有表都是MyISAM.这些表中的大多数彼此相关,这意味着许多查询使用ID上的连接并检索数据.
其中一个表包含7-10百万条记录,如果我想执行搜索或更新甚至检索所有数据,它会变慢.现在我向我的老板提出了一个解决方案,即将表转换为InnoDB可能会提供更好的性能.
我还解释了InnoDB的好处:
由于我们总是在键上连接多个表并且它们是相关的,因此最好使用外键并使用关系数据库来避免孤立行.我在其中一张大桌子里发现了大约10-15k孤儿行,不得不手动删除它们.
支持事务,我们不时执行大的更新,如果其中一个失败,我们必须用备份的表替换整个表并再次运行更新以确保所有查询都已执行.使用InnoDB,如果查询2失败,我们可以恢复查询1的任何更改.
现在我从老板得到的回应是我需要证明InnoDB的运行速度比MyISAM快.我的问题是,通过消除孤立行,不会超过2件事情提高应用程序本身的速度吗?
一般来说MyISAM比InnoDB更快吗?
注意:使用MySQL 5.5

上图显示了读取和更新操作的延迟,而列显示了吞吐量(操作/秒)我不确定MyISAM如何以如此低的延迟执行操作但在吞吐量方面仍与InnoDB保持同等水平?MongoDB在吞吐量方面也占主导地位,但具有比MyISAM更高的延迟.
这些结果如何有意义?
I have 8 millions of records in table and this query is just too slow. It's for sitemap (that we need to index it all). In this example I choose 1000 items from position 6 millions.
SELECT source, identifier
FROM mh_download
WHERE deleted =0
LIMIT 6000000 , 1000
Run Code Online (Sandbox Code Playgroud)
33 seconds
Table is MyISAM and column deleted has index. MySQL version 5.5.41.
我在 mysql 数据库中有 100 个表,并且都有存储引擎:MyISAM。我想一次将他们的存储引擎全部更改为 innoDB 并且我不想使用:
1.PHP (如何将 MyISAM 中的所有表转换为 InnoDB?
Laravel( Laravel & InnoDB )
一次一张表。(如何在phpmyadmin中更改数据库的存储引擎?)
SQL 查询。(如何将表存储引擎从 MyISAM 更改为 InnoDB)
通过 xampp 或类似的方式。(如何在XAMPP中设置默认存储引擎为InnoDB)
所以我想改变:ALL TABLE STORAGE ENGINE AT ONCE并使用phpmyadmin界面。
有什么帮助吗?