ここでは、MySql インデックスの基本的な知識については書きません。情報のポーターになるつもりはありません。
ヒントの共有: Workbench は、MySQL 用に特別に設計された ER/データベース モデリング ツールです。データベースの管理に加えて、SQL ステートメントを生成するための強力なツールでもあります。適切に使用すれば、半分の労力で 2 倍の結果が得られます。もちろん、基礎知識を理解していることが前提となります。
まず、インデックス操作のための SQL ステートメントをいくつか整理します。なぜなら、私が問題に遭遇したとき、Baidu で見つけた の返信が基本的に 間違っている だったからです。 を修正しに来てください。
1. 複数の主キー (PRIMARY) の削除
前提シナリオ: テーブルに複数の主キー (PRIMARY) を定義しました。たとえば、id は自動インクリメントする主キーです。 、userCode も主キーとして定義され、userAge も主キーとして定義されます。 1 つの ID のみを保持し、他の 2 つを削除する場合、対応する SQL ステートメントは次のとおりです:
説明: 指定されたテーブルを変更し、PRIMARY KEY を削除し、ID を PRIMARY として追加します。鍵。 ALTER TABLE `表名`
DROP PRIMARY KEY,ADD PRIMARY KEY (`id`);
警告: table_name は変更せずに実行しないでください。私が言いたいのは、index_name です。インデックスの名前を合理的に標準化するため (index_field 名など)、またはより良い名前がある場合は、メッセージを残してください。
それ以外の場合は、エラー:
MySQL の重複キー エラー (重複キー名 '') が報告されます。確かに、index_name が変更されていないためです。 Index_name が使用されます。 ALTER TABLE `table_name` ADD INDEX index_name (`column`)
(1). インデックスの使用は、物理的なストレージスペースを占有する必要があるだけでなく、損害も発生します。クエリの速度も逆効果になるため、データベース設計ではインデックスの定義を明確に理解する必要があります。インデックスを作成するためのいくつかの原則
1.最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。2.=和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式3.尽量选择区分度高的列作为索引,区分度的公式是count(distinct col)/count(*),表示字段不重复的比例,比例越大我们扫描的记录数越少,唯一键的区分度是1,而一些状态、性别字段可能在大数据面前区分度就是0,那可能有人会问,这个比例有什么经验值吗?使用场景不同,这个值也很难确定,一般需要join的字段我们都要求是0.1以上,即平均1条扫描10条记录4.索引列不能参与计算,保持列“干净”,比如from_unixtime(create_time) = ’2014-05-29’就不能使用到索引,原因很简单,b+树中存的都是数据表中的字段值,但进行检索时,需要把所有元素都应用函数才能比较,显然成本太大。所以语句应该写成create_time = unix_timestamp(’2014-05-29’);5.尽量的扩展索引,不要新建索引。比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可
(2). インデックスの種類
1. 通常のインデックス制限のない最も基本的なインデックス
2. 一意のインデックス インデックス列の値は一意である必要がありますが、空である必要があります。値は許可されています
3. 主キー インデックス 主キー インデックスは、NULL 値を許可しない特別な一意のインデックスです
単一の複数列インデックス (結合インデックス) の方が効率的です複数の単一列インデックスよりも
以上がMySQLインデックス操作の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。