English 中文(简体)
简便的INSERT query on InnoDB 占用太多的资金
原标题:A simple INSERT query on InnoDB taking too much

我有这样一个简单问题:

INSERT IGNORE INTO beststat (bestid,period,rawView) VALUES ( 4510724 , 201205 , 1 ) 

表格:

CREATE TABLE `beststat` (
 `bestid` int(11) unsigned NOT NULL,
 `period` mediumint(8) unsigned NOT NULL,
 `view` mediumint(8) unsigned NOT NULL DEFAULT  0 ,
 `rawView` mediumint(8) unsigned NOT NULL DEFAULT  0 ,
 PRIMARY KEY (`bestid`,`period`),
) ENGINE=InnoDB AUTO_INCREMENT=2020577 DEFAULT CHARSET=utf8

完成这项工作需要1个空白。


<>Side Note: 实际上,它不一定总是一帆风顺。 有时甚至发生在0.05个秘密。 但常常需要1个秘密。


本表(最佳状况)目前有~500 000记录及其规模:40MB。 页: 1

这是我数据库中唯一一个非行表格(其他是MyISAM)。

<编码> ANALYZE TABLE Beststat show:OK

难道不会对非行环境产生什么错误?

最佳回答

因此,你在表格上有两个独特的指数。 你们的主要钥匙是自动编号。 由于在数据中添加数据并不真正属于数据的一部分,因此,你称之为人为的主要关键。 现在,你有一个独特的最佳和时期指数。 如果最佳和最短时期是独一无二的,那将是主要关键人物的良好候选人。

因诺德布作为树木或肥皂存放桌。 如果你没有在无纸桌上确定一个主要关键点,那么如果你确定一个主要关键点,就算出一个小树。 因此,在你的情况下,树木储存在基于汽车号钥匙的磁盘上。 因此,当你制定第二个指数时,它实际上以指数中的最佳和期限数值在软盘上创造了第二个树。 该指数不包括表内其他栏目,只列出最佳、最长时间和主要价值。

现在,你在数据上加上一句话,就是要确保独特的指数永远是独特的。 因此,它读到该指数,看看你是否试图添加重复价值。 而进展缓慢的正是这种情况。 它首先要通过测试书写数据确保独一无二。 然后,它还必须在独特的指数中列入最佳、时期和主要价值。 因此,总业务将改为价值1的指数,在表1中插入“最佳”和“指标”的时期。 共有3个行动。 如果你删除了汽车编号,只使用独一无二的索引作为主要关键,那么如果在表格中插入独一无二的话,就会读到表格。 在此情况下,请将以下业务数目改为表,以核对表1中的数值。 这是两项行动,即三项行动。 因此,删除多余的汽车号,减少了33%。

我希望这一点是清楚的,因为我正在从我的安乐器和自动镜头上把诺德改变为出生。 Wish I的计算机。

问题回答

大约3年前,我进行了一些模拟,作为客户一些评价项目的一部分。 他们需要能够寻找一个数据不断增加的表格,他们希望能跟上时代。

非洲开发银行从一开始就取得了更好的成果,但迅速恶化(在1温记录之前),直到我删除所有指数(包括初级指数)。 当时,InnoDB在执行插入/更新内容时,已优先于MyISAM。 (我更糟糕的是,你只用手提电脑进行测试。)

结论: 如果你有指数,特别是独一无二的指数,就永远不会出现。

我建议优化以下工作:

  1. Remove all indexes from your beststat table and use it as a simple dump.
  2. If you really need these unique indexes, consider some programmable solution (like remembering the max bestid at all time, and insisting that the new record is above that number - and immediately increasing this number. (But do you really need so many unique fields - and they all sound to me just like indexes.)
  3. Have a background thread move new records from InnoDB to another table (which can be MyISAM) where they would be indexed.
  4. Consider dropping indexes temporarily and then after bulk update re-indexing the table, possibly switching two tables so that querying is never interrupted.

我承认,这些是理论上的解决办法,但这是我能说的最好办法。

Oh,如果您的桌子计划增长到数百万人,则考虑采用无差别的解决办法。





相关问题
SQL SubQuery getting particular column

I noticed that there were some threads with similar questions, and I did look through them but did not really get a convincing answer. Here s my question: The subquery below returns a Table with 3 ...

please can anyone check this while loop and if condition

<?php $con=mysql_connect("localhost","mts","mts"); if(!con) { die( unable to connect . mysql_error()); } mysql_select_db("mts",$con); /* date_default_timezone_set ("Asia/Calcutta"); $date = ...

php return a specific row from query

Is it possible in php to return a specific row of data from a mysql query? None of the fetch statements that I ve found return a 2 dimensional array to access specific rows. I want to be able to ...

Character Encodings in PHP and MySQL

Our website was developed with a meta tag set to... <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> This works fine for M-dashes and special quotes, etc. However, I ...

Pagination Strategies for Complex (slow) Datasets

What are some of the strategies being used for pagination of data sets that involve complex queries? count(*) takes ~1.5 sec so we don t want to hit the DB for every page view. Currently there are ~...

Averaging a total in mySQL

My table looks like person_id | car_id | miles ------------------------------ 1 | 1 | 100 1 | 2 | 200 2 | 3 | 1000 2 | 4 | 500 I need to ...

热门标签