目次
1.命名规范
MySQL使用技巧" >MySQL使用技巧
ホームページ データベース mysql チュートリアル MySQL开发规范与使用技巧总结_MySQL

MySQL开发规范与使用技巧总结_MySQL

May 30, 2016 pm 05:11 PM
スキル

1.命名规范

1.库名、表名、字段名必须使用小写字母,并采用下划线分割
a)MySQL有配置参数lower_case_table_names,不可动态更改,linux系统默认为 0,即库表名以实际情况存储,大小写敏感。如果是1,以小写存储,大小写不敏感。如果是2,以实际情况存储,但以小写比较。
b)如果大小写混合使用,可能存在abc,Abc,ABC等多个表共存,容易导致混乱。
c)字段名显示区分大小写,但实际使?用不区分,即不可以建立两个名字一样但大小写不一样的字段。
d)为了统一规范, 库名、表名、字段名使用小写字母。

2.库名、表名、字段名禁止超过32个字符。
库名、表名、字段名支持最多64个字符,但为了统一规范、易于辨识以及减少传输量,禁止超过32个字符。

3.使用INNODB存储引擎。
INNODB引擎是MySQL5.5版本以后的默认引擘,支持事务、行级锁,有更好的数据恢复能力、更好的并发性能,同时对多核、大内存、SSD等硬件支持更好,支持数据热备份等,因此INNODB相比MyISAM有明显优势。

4.库名、表名、字段名禁止使用MySQL保留字。
当库名、表名、字段名等属性含有保留字时,SQL语句必须用反引号引用属性名称,这将使得SQL语句书写、SHELL脚本中变量的转义等变得?非常复杂。

5.禁止使用分区表。
分区表对分区键有严格要求;分区表在表变大后,执?行DDL、SHARDING、单表恢复等都变得更加困难。因此禁止使用分区表,并建议业务端手动SHARDING。

6.建议使用UNSIGNED存储非负数值。
同样的字节数,非负存储的数值范围更大。如TINYINT有符号为 -128-127,无符号为0-255。

7.建议使用INT UNSIGNED存储IPV4。
用UNSINGED INT存储IP地址占用4字节,CHAR(15)则占用15字节。另外,计算机处理整数类型比字符串类型快。使用INT UNSIGNED而不是CHAR(15)来存储IPV4地址,通过MySQL函数inet_ntoa和inet_aton来进行转化。IPv6地址目前没有转化函数,需要使用DECIMAL或两个BIGINT来存储。
例如:

<code class="hljs sql">SELECT INET_ATON(&#39;209.207.224.40&#39;); 3520061480
SELECT INET_NTOA(3520061480); 209.207.224.40</code>
ログイン後にコピー

<strong>8.强烈建议使用TINYINT来代替ENUM类型。</strong><br /> ENUM类型在需要修改或增加枚举值时,需要在线DDL,成本较高;ENUM列值如果含有数字类型,可能会引起默认值混淆。

<strong>9.使用VARBINARY存储大小写敏感的变长字符串或二进制内容。</strong><br /> VARBINARY默认区分大小写,没有字符集概念,速度快。

<strong>10.INT类型固定占用4字节存储</strong><br /> 例如INT(4)仅代表显示字符宽度为4位,不代表存储长度。数值类型括号后面的数字只是表示宽度而跟存储范围没有关系,比如INT(3)默认显示3位,空格补齐,超出时正常显示,python、java客户端等不具备这个功能。

<strong>11.区分使用DATETIME和TIMESTAMP。</strong><br /> 存储年使用YEAR类型。存储日期使用DATE类型。 存储时间(精确到秒)建议使用TIMESTAMP类型。<br /> DATETIME和TIMESTAMP都是精确到秒,优先选择TIMESTAMP,因为TIMESTAMP只有4个字节,而DATETIME8个字节。同时TIMESTAMP具有自动赋值以及?自动更新的特性。注意:在5.5和之前的版本中,如果一个表中有多个timestamp列,那么最多只能有一列能具有自动更新功能。

如何使用TIMESTAMP的自动赋值属性?<br /> a)自动初始化,而且自动更新:

<code class="hljs sql"><code class="hljs vbnet">column1 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATECURRENT_TIMESTAMP</code></code>
ログイン後にコピー

<code class="hljs vbnet">b)只是自动初始化:

<code class="hljs sql"><code class="hljs vbnet"><code class="hljs php"> column1 TIMESTAMP DEFAULT CURRENT_TIMESTAMP</code></code></code>
ログイン後にコピー

<code class="hljs vbnet"><code class="hljs php">c)自动更新,初始化的值为0:

<code class="hljs sql"><code class="hljs vbnet"><code class="hljs php"><code class="hljs sql"> column1 TIMESTAMP DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP</code></code></code></code>
ログイン後にコピー

<code class="hljs vbnet"><code class="hljs php"><code class="hljs sql">d)初始化的值为0:

<code class="hljs sql"><code class="hljs vbnet"><code class="hljs php"><code class="hljs sql"><code class="hljs php">column1 TIMESTAMP DEFAULT 0</code></code></code></code></code>
ログイン後にコピー

<code class="hljs vbnet"><code class="hljs php"><code class="hljs sql"><code class="hljs php"><strong>12.所有字段均定义为NOT NULL。</strong><br /> a)对表的每一行,每个为NULL的列都需要额外的空间来标识。<br /> b)B树索引时不会存储NULL值,所以如果索引字段可以为NULL,索引效率会下降。<br /> c)建议用0、特殊值或空串代替NULL值。

<code class="hljs vbnet"><code class="hljs php"><code class="hljs sql"><code class="hljs php">MySQL使用技巧

<code class="hljs vbnet"><code class="hljs php"><code class="hljs sql"><code class="hljs php"><strong>1.将大字段、访问频率低的字段拆分到单独的表中存储,分离冷热数据。</strong><br /> 有利于有效利用缓存,防?止读入无用的冷数据,较少磁盘IO,同时保证热数据常驻内存提?高缓存命中率。

<code class="hljs vbnet"><code class="hljs php"><code class="hljs sql"><code class="hljs php"><strong>2.禁止在数据库中存储明文密码。</strong><br /> 采用加密字符串存储密码,并保证密码不可解密,同时采用随机字符串加盐保证密码安全。

<code class="hljs vbnet"><code class="hljs php"><code class="hljs sql"><code class="hljs php"><strong>3.表必须有主键,推荐使用UNSIGNED自增列作为主键。</strong><br /> 表没有主键,INNODB会默认设置隐藏的主键列;没有主键的表在定位数据行的时候非常困难,也会降低基于行复制的效率。

<code class="hljs vbnet"><code class="hljs php"><code class="hljs sql"><code class="hljs php"><strong>4.禁止冗余索引。</strong><br /> 索引是双刃剑,会增加维护负担,增?大IO压力。(a,b,c)、(a,b),后者为冗余索引。可以利用前缀索引来达到加速目的,减轻维护负担。

<code class="hljs vbnet"><code class="hljs php"><code class="hljs sql"><code class="hljs php"><strong>5.禁止重复索引。</strong><br /> primary key a;uniq index a;重复索引增加维护负担、占用磁盘空间,同时没有任何益处。

<code class="hljs vbnet"><code class="hljs php"><code class="hljs sql"><code class="hljs php"><strong>6.不在低基数列上建立索引,例如&ldquo;性别&rdquo;。</strong><br /> 大部分场景下,低基数列上建立索引的精确查找,相对于不建立索引的全表扫描没有任何优势,而且增大了IO负担。

<code class="hljs vbnet"><code class="hljs php"><code class="hljs sql"><code class="hljs php"><strong>7.合理使用覆盖索引减少IO,避免排序。</strong><br /> 覆盖索引能从索引中获取需要的所有字段,从?而避免回表进行二次查找,节省IO。<br /> INNODB存储引擎中,secondary index(非主键索引,又称为辅助索引、二级索引)没有直接存储行地址,而是存储主键值。<br /> 如果用户需要查询secondary index中所不包含的数据列,则需要先通过secondary index查找到主键值,然后再通过主键查询到其他数据列,因此需要查询两次。覆盖索引则可以在?一个索引中获取所有需要的数据,因此效率较高。<br /> 例如SELECT email,uid FROM user_email WHERE uid=xx,如果uid不是主键,适当时候可以将索引添加为index(uid,email),以获得性能提升。

<code class="hljs vbnet"><code class="hljs php"><code class="hljs sql"><code class="hljs php"><strong>8.用IN代替OR。SQL语句中IN包含的值不应过多,应少于1000个。</strong><br /> IN是范围查找,MySQL内部会对IN的列表值进行排序后查找,比OR效率更高。

<code class="hljs vbnet"><code class="hljs php"><code class="hljs sql"><code class="hljs php"><strong>9.表字符集使用UTF8,必要时可申请使用UTF8MB4字符集。</strong><br /> a)UTF8字符集存储汉字占用3个字节,存储英文字符占用一个字节。<br /> b)UTF8统一而且通用,不会出现转码出现乱码风险。<br /> c)如果遇到EMOJ等表情符号的存储需求,可申请使用UTF8MB4字符集。

<code class="hljs vbnet"><code class="hljs php"><code class="hljs sql"><code class="hljs php"><strong>10.用UNION ALL代替UNION。</strong><br /> UNION ALL不需要对结果集再进行排序。

<code class="hljs vbnet"><code class="hljs php"><code class="hljs sql"><code class="hljs php"><strong>11.禁止使用order by rand()。</strong><br /> order by rand()会为表增加一个伪列,然后用rand()函数为每一行数据计算出rand()值,然后基于该行排序,这通常都会生成磁盘上的临时表,因此效率非常低。建议先使用rand()函数获得随机的主键值,然后通过主键<br /> 获取数据。

<code class="hljs vbnet"><code class="hljs php"><code class="hljs sql"><code class="hljs php"><strong>12.建议使用合理的分页方式以提高分页效率。</strong><br /> 假如有类似下面分页语句:

<code class="hljs sql"><code class="hljs vbnet"><code class="hljs php"><code class="hljs sql"><code class="hljs php"><code class="hljs sql">SELECT * FROM table ORDER BY TIME DESC LIMIT 10000,10;</code></code></code></code></code></code>
ログイン後にコピー

<code class="hljs vbnet"><code class="hljs php"><code class="hljs sql"><code class="hljs php"><code class="hljs sql">这种分页方式会导致大量的io,因为MySQL使用的是提前读取策略。<br /> 推荐分页方式:

<code class="hljs sql"><code class="hljs vbnet"><code class="hljs php"><code class="hljs sql"><code class="hljs php"><code class="hljs sql"><code class="hljs sql">SELECT * FROM table WHERE TIME<last_time 10.="" as="" by="" desc="" from="" id="" inner="" join="" limit="" order="" pre="" select="" t="" table="" time=""><p><strong>13.SELECT只获取必要的字段,禁?止使用SELECT *。</strong> 

减少网络带宽消耗; 

能有效利用覆盖索引; 

表结构变更对程序基本无影响。</p><p><strong>14.SQL中避免出现now()、rand()、sysdate()、current_user()等不确定结果的函数。</strong> 

语句级复制场景下,引起主从数据不一致;不确定值的函数,产?生的SQL语句无法利用QUERY CACHE。</p><p><strong>15.采用合适的分库分表策略。例如千库十表、十库百表等。</strong> 

采用合适的分库分表策略,有利于业务发展后期快速对数据库进行水平拆分,同时分库可以有效利?用MySQL 

的多线程复制特性。</p><p><strong>16.减少与数据库交互次数,尽量采用批量SQL语句。</strong> 

使用下面的语句来减少和db的交互次数:</p><pre class="prebrush"><code class="hljs sql">a)INSERT ... ON DUPLICATE KEY UPDATE
b)REPLACE INTO
c)INSERT IGNORE
d)INSERT INTO VALUES() </code>
ログイン後にコピー

<strong>17.拆分复杂SQL为多个小SQL,避免大事务。</strong><br /> 简单的SQL容易使?用到MySQL的QUERY CACHE;减少锁表时间特别是MyISAM;可以使用多核 CPU。

<strong>18.对同一个表的多次alter操作必须合并为一次操作。</strong><br /> mysql对表的修改绝大部分操作都需要锁表并重建表,而锁表则会对线上业务造成影响。为减少这种影响,必须把对表的多次alter操作合并为一次操作。例如,要给表t增加一个字段b,同时给已有的字段aa建立索引,<br /> 通常的做法分为两步:

<code class="hljs sql"><code class="hljs sql">alter table t add column b varchar(10);</code></code>
ログイン後にコピー

<code class="hljs sql">然后增加索引:

<code class="hljs sql"><code class="hljs sql"><code class="hljs sql">alter table t add index idx_aa(aa);</code></code></code>
ログイン後にコピー

<code class="hljs sql"><code class="hljs sql">正确的做法是:

<code class="hljs sql"><code class="hljs vbnet"><code class="hljs php"><code class="hljs sql"><code class="hljs php"><code class="hljs sql"><code class="hljs sql"><code class="hljs sql"><code class="hljs sql">alter table t add column b varchar(10),add index idx_aa(aa);</code></code></code></code></code></code></code></code></code>
ログイン後にコピー

<code class="hljs vbnet"><code class="hljs php"><code class="hljs sql"><code class="hljs sql"><code class="hljs sql"><code class="hljs sql"><strong>19.避免使用存储过程、触发器、视图、自定义函数等。</strong><br> 这些高级特性有性能问题,以及未知BUG较多。业务逻辑放到数据库会造成数据库的DDL、SCALE OUT、<br> SHARDING等变得更加困难。

<code class="hljs vbnet"><code class="hljs sql"><code class="hljs sql"><code class="hljs sql"><code class="hljs sql"><strong>20.禁止有super权限的应用程序账号存在。</strong><br> 安全第一。super权限会导致read only失效,导致较多诡异问题而且很难追踪。

<code class="hljs sql"><code class="hljs sql"><code class="hljs sql"><code class="hljs sql"><strong>21.不要在MySQL数据库中存放业务逻辑。</strong><br> 数据库是有状态的服务,变更复杂而且速度慢,如果把业务逻辑放到数据库中,将会限制业务的快速发展。建议把业务逻辑提前,放到前端或中间逻辑层,而把数据库作为存储层,实现逻辑与存储的分离。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

定量的な財務分析に Go 言語を使用するにはどうすればよいですか? 定量的な財務分析に Go 言語を使用するにはどうすればよいですか? Jun 11, 2023 am 08:51 AM

現代の金融の分野では、データサイエンスと人工知能技術の台頭により、定量的金融が徐々に重要な方向になってきています。 Go 言語は、データを効率的に処理し、分散システムを展開できる静的型プログラミング言語として、クオンツ ファイナンスの分野で徐々に注目を集めています。この記事では、Go 言語を使用して定量的な財務分析を行う方法を紹介します 具体的な内容は次のとおりです: 財務データの取得 まず、財務データを取得する必要があります。 Go 言語のネットワーク プログラミング機能は非常に強力で、さまざまな財務データを取得するために使用できます。比較する

データマイニングに Go 言語を使用するにはどうすればよいですか? データマイニングに Go 言語を使用するにはどうすればよいですか? Jun 10, 2023 am 08:39 AM

ビッグデータとデータマイニングの台頭により、ますます多くのプログラミング言語がデータマイニング機能をサポートし始めています。 Go 言語は、高速、安全、効率的なプログラミング言語として、データ マイニングにも使用できます。では、Go 言語をデータマイニングに使用するにはどうすればよいでしょうか?ここでは、重要な手順とテクニックをいくつか紹介します。データの取得 まず、データを取得する必要があります。これは、Web ページ上の情報のクローリング、API を使用したデータの取得、データベースからのデータの読み取りなど、さまざまな手段を通じて実現できます。 Go 言語にはリッチ HTTP が付属しています

C# を使用して最小スパニング ツリー アルゴリズムを作成する方法 C# を使用して最小スパニング ツリー アルゴリズムを作成する方法 Sep 19, 2023 pm 01:55 PM

C# を使用して最小スパニング ツリー アルゴリズムを作成する方法. 最小スパニング ツリー アルゴリズムは、グラフの接続性の問題を解決するために使用される重要なグラフ理論アルゴリズムです。コンピューター サイエンスでは、最小スパニング ツリーとは、スパニング ツリーのすべてのエッジの重みの合計が最小となる、接続されたグラフのスパニング ツリーを指します。この記事では、C# を使用して最小限のスパニング ツリー アルゴリズムを作成する方法を紹介し、具体的なコード例を示します。まず、問題を表すグラフ データ構造を定義する必要があります。 C# では、隣接行列を使用してグラフを表現できます。隣接行列は、各要素が表す 2 次元配列です。

PHP を使用して簡単な SEO 最適化関数を開発する方法 PHP を使用して簡単な SEO 最適化関数を開発する方法 Sep 20, 2023 pm 04:18 PM

PHP を使用して簡単な SEO 最適化機能を開発する方法 SEO (SearchEngineOptimization)、または検索エンジン最適化とは、Web サイトの構造とコンテンツを改善することで検索エンジンでの Web サイトのランキングを向上させ、それによってより多くのオーガニック トラフィックを獲得することを指します。 Web サイト開発において、PHP を使用して簡単な SEO 最適化機能を実装するにはどうすればよいでしょうか?この記事では、開発者が PHP プロジェクトに SEO 最適化を実装するのに役立つ、一般的に使用される SEO 最適化テクニックと具体的なコード例をいくつか紹介します。 1. 使いやすい

nginx を使用してホットリンクを防ぐ方法 nginx を使用してホットリンクを防ぐ方法 Jun 11, 2023 pm 01:25 PM

インターネットの普及に伴い、写真や動画などの外部リンク機能を提供するWebサイトが増えています。しかし、この外部リンク機能は盗まれやすいのです。ホットリンクとは、他の Web サイトがあなたの Web サイト上の写真、ビデオ、その他のリソースを使用し、それらのリソースを独自のサーバーにダウンロードするのではなく、参照アドレスを通じて自分の Web サイトに直接表示することを意味します。このようにして、ホットリンク Web サイトは Web サイトのトラフィックと帯域幅のリソースを無料で使用できるため、リソースが無駄になり、Web サイトの速度に影響を与えます。この問題に対処するには、Nginx を使用してホットリンクを防ぐことができます。 Nginxは

簡単な解決策: pip ミラー ソースの使用テクニックの完全ガイド 簡単な解決策: pip ミラー ソースの使用テクニックの完全ガイド Jan 16, 2024 am 10:31 AM

ワンクリック ソリューション: pip ミラー ソースの使用スキルをすばやくマスターします はじめに: pip は、Python で最も一般的に使用されるパッケージ管理ツールであり、Python パッケージのインストール、アップグレード、管理を簡単に行うことができます。ただし、よく知られている理由により、デフォルトのミラー ソースを使用してインストール パッケージをダウンロードすると時間がかかるため、この問題を解決するには、国内のミラー ソースを使用する必要があります。この記事では、pip ミラー ソースの使用スキルをすぐにマスターする方法と、具体的なコード例を紹介します。始める前に、pip ミラー ソースの概念を理解してください。

conda仮想環境の利点と運用テクニックをマスターする conda仮想環境の利点と運用テクニックをマスターする Feb 18, 2024 pm 07:46 PM

conda 仮想環境の利点と使用テクニックを理解するには、具体的なコード例が必要です Python は、科学計算、データ分析、人工知能などの分野で広く使用されている非常に人気のあるプログラミング言語です。 Python エコシステムには、多数のサードパーティ ライブラリとツールがあり、プロジェクトごとに異なるバージョンのライブラリを使用する必要がある場合があります。これらのライブラリの依存関係を管理するには、conda 仮想環境が重要なツールになります。 conda は、簡単に作成および実行できるオープンソースのパッケージ管理システムおよび環境管理システムです。

C++ で分割統治アルゴリズムを使用する方法 C++ で分割統治アルゴリズムを使用する方法 Sep 20, 2023 pm 03:19 PM

C++ で分割統治アルゴリズムを使用する方法 分割統治アルゴリズムは、問題をいくつかのサブ問題に分解し、サブ問題の解を組み合わせて元の問題の解を得る方法です。応用範囲が広く、数学問題、並べ替え問題、グラフ問題など、さまざまな種類の問題の解決に使用できます。この記事では、C++ で分割統治アルゴリズムを使用する方法を紹介し、具体的なコード例を示します。 1. 基本的な考え方 分割統治アルゴリズムの基本的な考え方は、大きな問題をいくつかの小さなサブ問題に分解し、各サブ問題を再帰的に解決し、最後にサブ問題をマージすることです。

See all articles