質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

1174閲覧

MySQLでSELECTしても出てくる筈の行が出てこない

schwarzewald

総合スコア18

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/06/11 10:19

編集2019/06/11 10:43

MySQLを用いてカウンターを作っているのですが、行が出てくる時と出てこない時があって困っています。

MySQL

1-- 2-- テーブルの構造 `counter` 3-- 4 5CREATE TABLE IF NOT EXISTS `counter` ( 6 `page_id` varchar(11) NOT NULL, 7 `count` int(11) NOT NULL 8) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 9 10-- 11-- Indexes for table `counter` 12-- 13ALTER TABLE `counter` 14 ADD PRIMARY KEY (`page_id`), 15 ADD KEY `page_id` (`page_id`); 16 17

page_idはpもしくはiに番号という形式で、countにカウントされた数を入れています。
行数が500万行ぐらいあります。

PHP

1$page_id ="p123"; 2 3require_once("./common/mysql.counter.php"); 4$sql = "SELECT * FROM `counter` WHERE `page_id`LIKE :page_id"; 5$st = $cpdo->prepare($sql); 6$st->bindValue(':page_id', $page_id); 7$st->execute(); 8$counter = $st->fetch(); 9 10$erlog = $st->errorInfo(); 11echo "<!--"; 12var_dump($erlog); 13echo "-->"; 14

$counterが空っぽの時のerrorInfoはこの状態です。

array(3) {
[0]=>
string(5) "00000"
[1]=>
NULL
[2]=>
NULL
}

そもそも主キーを英数字混じりのvarcharにしているのが良くないのでは?と思い、一度mysqldumpした後、主キーを数字のみに変え、データ型もvarcharからintに変えて本番環境にリストアしたところ、INSERTが異様に重くなり使いものにならなくなってやむなく戻しました。インデックスの貼り方に問題があったのでしょうか?

$counterが空になる原因の調べ方と、重くならないようにする方法についてお知恵拝借できれば幸いです。

PHP 7.1.18、MySQL5.6.44 InnoDBです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

take88

2019/06/11 11:30

errorInfoの結果は正常を意味してますね。`PDO::errorInfo()` でなにかエラー情報は出力されませんか? 0件になるときと 同じクエリを mysql で実行することは出来ますか?
schwarzewald

2019/06/11 11:53

`PDO::errorInfo()` というのはどこでやればいいのでしょうか?
schwarzewald

2019/06/11 11:57

すみません、なんだか問題の切り分けが出来ていない気がするので一旦閉じます
guest

回答2

0

counterテーブルについてpage_idに対してプライマリーキー設定と
インデックス設定をしていますが、プライマリーキーはインデックスを兼ねるので
インデックスは不要です。

逆に、page_idをプライマリーキーとせずに、auto_incrementのintを設定した
カラムを作成しそこをプライマリーキーとして、page_idにはunique属性を
つけるほうがデータの使い回しはよくなります

また高速化についてはすでに自己解決しているようですがLIKEは鬼門なので
等号で処理できるものはそれをおすすめします

投稿2019/06/12 01:20

yambejp

総合スコア114829

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

schwarzewald

2019/06/12 08:15

なるほど参考にいたします…
guest

0

自己解決

重くなる問題についてはLIKEを=に変えたら解決しました

投稿2019/06/11 11:47

schwarzewald

総合スコア18

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問