0

現在テーブルに2,280行あるMySQLMyISAMデータベースは、過去6か月ほどで2回ロックされています。

新しい行を追加しようとすると、次の増分値がテーブルの最後のIDよりも大きい場合に、「主キーはすでに使用されています」と表示されます。自動インクリメントをリセットすると、自動的に修正されるようです。

データベースは、1日に約200回以上のヒットがあり、ピーク時は1時間に約25〜20回のサイト用であるため、データベースの過負荷が原因であるとは想像できません。

なぜこれが発生し続けるのか、問題を修正できるかどうかを調べて、クライアントがサイトに新しい記事を追加できないときに電話をかけ続ける必要がないようにします。

編集:潜在的なコメントを先取りするために、私はテーブルとコードが理想的ではないことを認識していますが、それが問題の根本的な原因、私が生きることができるパフォーマンス/セキュリティの低下でない限り、これを改善する方法を探していません(ちょうど)、しかし私はそれがテーブルをロックする原因となる可能性があるものを理解する必要があります。ありがとう。

テーブル定義

CREATE TABLE `articles` (
  `article_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `article_meta_desc` text,
  `article_meta_keyw` text,
  `article_title` varchar(255) DEFAULT NULL,
  `article_date` int(10) unsigned DEFAULT NULL,
  `article_intro` text,
  `article_embed` text,
  `article_content` text,
  `article_sector` varchar(255) DEFAULT NULL,
  `article_type` varchar(255) DEFAULT NULL,
  `article_ma` tinyint(1) unsigned DEFAULT NULL,
  `article_pn` tinyint(1) unsigned DEFAULT NULL,
  `article_cw` tinyint(1) unsigned DEFAULT NULL,
  `article_er` tinyint(1) unsigned DEFAULT NULL,
  `article_kr` tinyint(1) unsigned DEFAULT NULL,
  `article_rc` tinyint(1) unsigned DEFAULT NULL,
  `article_rs` tinyint(1) DEFAULT NULL,
  `article_img_s` varchar(255) DEFAULT NULL,
  `article_img_l` varchar(255) DEFAULT NULL,
  `article_link` varchar(255) DEFAULT NULL,
  `article_highlight` int(10) unsigned DEFAULT NULL,
  `article_slug` text,
  `article_alias` text,
  `article_hide` smallint(1) unsigned NOT NULL DEFAULT '0',
  `article_ad_layout` tinyint(1) unsigned DEFAULT '0',
  `article_ad_banner` smallint(5) unsigned DEFAULT NULL,
  `article_ad_sky` smallint(5) unsigned DEFAULT NULL,
  `article_ad_square1` smallint(5) unsigned DEFAULT NULL,
  `article_ad_square2` smallint(5) unsigned DEFAULT NULL,
  `article_ad_square3` smallint(5) unsigned DEFAULT NULL,
  `article_newswire` smallint(1) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`article_id`),
  FULLTEXT KEY `full_text` (`article_title`,`article_intro`,`article_content`)
) ENGINE=MyISAM AUTO_INCREMENT=2384 DEFAULT CHARSET=latin1 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC;

_ma、_pn、_cw、_er、_kr、_rc、_rsは、どのカテゴリの記事が対象であるかを示すために使用されます。広告とセクションのテーブルの悪い使用を無視してください、サイトはかなり昔に作られました、私は:p以来よりよく学びました

ステートメントを挿入

INSERT INTO articles (article_id, article_meta_desc, article_meta_keyw, article_title, article_date, article_intro, article_embed, article_content, article_sector, article_type, article_ma, article_pn, article_cw, article_er, article_kr, article_rc, article_rs, article_img_s, article_img_l, article_link, article_highlight, article_slug, article_alias, article_hide)
VALUES ('','$insert_article_meta_desc','$insert_article_meta_keyw','$insert_article_title','$insert_article_date','$insert_article_intro','$insert_article_embed','$insert_article_content','$insert_article_sector','$insert_article_category','$insert_article_ma','$insert_article_pn','$insert_article_cw','$insert_article_er','$insert_article_kr','$insert_article_rc','$insert_article_rs','$insert_article_img_s','$insert_article_img_l','','$insert_article_highlight','$insert_article_slug','','$insert_article_hide')

繰り返しになりますが、古いサイト、ご容赦ください。idを''に設定し、次に次の増分値に設定する挿入を行うことと関係があるかどうかわからない場合、これにより問題が発生する可能性がありますか?

4

1 に答える 1

0

article_id フィールド名と値の最初の '' を INSERT stmt から取り出してみてください。自動インクリメント ID が自動的に割り当てられるはずです。

于 2012-10-24T10:17:46.940 に答える