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

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

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

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

PHP

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

CodeIgniter

CodeIgniterは、PHP向けオープンソースのWebアプリケーションフレームワークです。CodeIgniterは覚える構文が少なく、自由度も高いため、PHPを理解していれば構築が簡単です。

Q&A

解決済

2回答

2595閲覧

mysqlのdelete文でindexが使われない

rotaliano

総合スコア13

MySQL

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

PHP

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

CodeIgniter

CodeIgniterは、PHP向けオープンソースのWebアプリケーションフレームワークです。CodeIgniterは覚える構文が少なく、自由度も高いため、PHPを理解していれば構築が簡単です。

0グッド

0クリップ

投稿2019/03/26 12:40

編集2019/03/26 13:36

質問

下記のようなテーブルがありphpよりdeleteした所、かなりの時間を要しました。
explainしたみた結果、indexが使われていないことがわかりました。
なぜかindexが利用されません。

  • php code
public function products_delete($code, $products_id) { $this->db->where(['code' => $code, 'products_id' => $products_id])->delete('master'); }
  • テーブル構造
CREATE TABLE `master` ( `code` varchar(50) NOT NULL, `products_id` int(10) unsigned NOT NULL, `code_id` int(10) unsigned NOT NULL, UNIQUE KEY `code_products_id` (`code`,`products_id`), KEY `code_` (`code`), KEY `code_id` (`code_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  • 発行したSQL
explain delete from master where code = 1009000100 and products_id = 0
  • 結果
id select_type table partitions type possible_keys key key_len ref rows filtered Extra 1 DELETE master NULL ALL NULL NULL NULL NULL 5546430 100.00 Using where

試したこと1

  • '1009000100' とシングルクォートで囲ったらindexが使われた
explain delete from master where code = '1009000100' and products_id = 0; id select_type table partitions type possible_keys key key_len ref rows filtered Extra 1 DELETE master NULL range code_products_id,code_ code_products_id 156 const,const 1 100.00 Using where

試したこと2

  • select文ではindexが利用される
explain select * from master where code = 1009000100 and products_id = 0; id select_type table partitions type possible_keys key key_len ref rows filtered Extra 1 SIMPLE master NULL index code_products_id,code_ code_id 4 NULL 5546430 1.00 Using where; Using index

推測

  • select文だと条件のcodeが文字列に変換されて実行されるからindexが利用される?
  • delete文だと型変換がされずそのまま実行されてしまう?

補足情報(FW/ツールのバージョンなど)

  • mysql 5.7
  • php 7.1
  • codeigniter 1.7

よろしくおねがいします。

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

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

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

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

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

m.ts10806

2019/03/26 12:43

PHPコードに問題がないとも言い切れません。 PHP側のコードもご提示ください(あとタグにも追加し、バージョンも記載してください)
rotaliano

2019/03/26 13:36

ご意見ありがとうございます。 追記しました。
guest

回答2

0

ベストアンサー

code varchar(50) NOT NULL,

products_id int(10) unsigned NOT NULL,

だから、

SQL

1delete from master where code = 1009000100 and products_id = 0

は、code が文字型で 1009000100 は数値ですから、master テーブル全件の code を数値型に変換してから1009000100 と比較します。だから、インデックスは使われません。
データ型の扱いにはシビアになれないと、この仕事への適性を疑われます。

投稿2019/03/26 13:07

Orlofsky

総合スコア16415

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

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

rotaliano

2019/03/26 13:31

ご回答ありがとうございます。 ちなみにselect文はオプティマイザが良しなに型変換してくれるのでしょうか?
Orlofsky

2019/03/27 12:22

オプティマイザは同じデータ型にしないと比較できないからです。決して「良しな」ではありません。 SQLの文法として、最初から delete from master where code = '1009000100' and products_id = 0 と文字列はシングルクォーティング single quoting (シングルクォートで囲む)してください。
guest

0

誤ったSQL文の挙動が場合によって異なるのに、理由などありません。
仕様です、と納得するしかありません。
正しいSQL文を書けばいいだけのことです。

投稿2019/03/26 13:13

iruyas

総合スコア1067

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

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

rotaliano

2019/03/26 13:32

ご回答ありがとうございます。 query builderを利用してました。 型を意識して渡さないとダメなんですね。 ※php code 追記しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問