Mysqlで一般的に使用されるいくつかのメソッド

1.現在までのタイムスタンプ

select *,FROM_UNIXTIME(create_time,'%Y-%m-%d %H:%i%s') as date from user where FROM_UNIXTIME(create_time,'%Y-%m-%d %H:%i%s') > curdate() group by date order by date desc;

上記のSQLステートメントでは、create_timeフィールドは日付としてフォーマットされ、フォーマット後のフィールドが検索およびソートされます。

よく見ると、グループと順序にフォーマットされたエイリアスdeteを直接使用しているのに対し、whereクエリはmysqlの実行順序に関連するフィールドを再フォーマットしていることがわかります。whereまで実行する場合、結果はまだ照会されておらず、エイリアスは自然に有効にならないため、注意が必要です。

2.条件付き判断

①IFNULL
select IFNULL(score1,score2) from score;

score1がNUllの場合、score2が返されます。それ以外の場合、score1が返されます。

②IF
select IF(sex,'男','女') from user;

最初のパラメータは条件です。浮動小数点数の場合は、0と見なして、「female」を返します。

最初のパラメータは比較として書くこともできます:sex = 1

③集計関数での条件判定
select count(case when age>10 then id end) from user;

上記のSQLステートメントは、年齢が10歳を超えるユーザーの数を照会します

3.中国のフィールドソーティング

フィールドが名前であると仮定して、拼音に値する中国語フィールドの最初の文字に従ってデータテーブルのデータを並べ替えます

名前の文字エンコードがlatin_swedish_ciの場合

select * from user order by birary(name) asc;

名前の文字エンコードがutf8_general_ciの場合

select * form user where 1 order by convert(name using gbk) collate gbk_chinese_ci asc;

4.指定された順序で並べ替えます

select * form user where id in(1,2,3,4,5) order by field(id,5,4,3,2,1);

戻り値はID5、4、3、2、1に従ってソートされます

5.スプライシングフィールド

select concat(id,name,'666') from user;

concat()のパラメーターは、データテーブルの文字列またはフィールドにすることができます。パラメータのフィールドの1つがNULLの場合、行データはNULLです。この状況を回避したい場合は、CONCAT_WS()を使用できます。使用法は少し異なります。

6.初期自己インクリメントIDの初期値は1です。

alter table 表名 auto_increment=1;

7.グループ後の他のフィールド

グループを使用して、同じ指定フィールドを持つ行を1つの行に結合した後、期待値であるグループフィールドを除いて、行内の他のフィールドが目的のフィールドではない場合があります。

たとえば、マージした後、時間フィールドcreate_timeの値が最大になりますが、create_timeが最大か最小かわからないことがよくあります。このとき、選択時に必要なフィールドを追加する必要があります。 、 といった:

select *,count(id),MAX(create_time) as last_time from pay_list group by uid;

8.mysqlのいくつかの簡単な操作原理

①mysqlがクエリステートメントを実行する場合、where条件の実行順序については、インターネット上で左から右に順番に実行されると言われているため、データ量の多いテーブルをクエリする場合は、最も無効なデータを除外できる条件を左端に置きます(間違っていても失うものはありません)。②mysqlinconditionselect * from a where id in(id_str);
の動作原理では、ステートメントの実行シーケンスは次のプロセスのようになります。

$a = select * from a;
$b = id_str;
$result = [];
foreach($a as $v){
	foreach($b as $vv){
		if($v['id'] == $vv){
			$resulr[] = $v;
		}
	}
}

whereが複数の条件を必要とし、条件が関連している場合。たとえば
、次のようにフィルタリングします。北京、21、22歳、上海、22、23歳。
従来の記述:Aから*を選択します、 'Shanghai')およびage in(21,22,23);が間違っていると、除外されます:Shanghai、21歳の無効なデータ。
上記のステートメントを次のように変更できます。select * from A where(address、age) in(( 'Beijing'、 '21')、( 'Beijing'、 '22')、( 'Shanghai'、 '22')、( 'Shanghai'、 '23')、);

9、数千万のデータカウント()

データ量が多い場合は、countを使用して数値をクエリします。インデックスがある場合でも、数十秒かかり、効率が低すぎます。mysqlを使用できることをオンラインで確認してください説明する関数は行数を取得します。
この関数は、SQLステートメントの実行効率を表示するために特に使用され、インターネット上で参照できる多くの記事があります。
定義:explainコマンドは非常に高速です。これは、explainが実際にクエリを実行するのではなく、クエリオプティマイザによって[推定される]行数を実行するためです。
Explainを使用すると、多くのパラメーターが返されることがわかり
ここに画像の説明を挿入
ます。行数である行を取得します。

10.百万レベルのデータページングの最適化

実際、データ数は100万未満で、データテーブルのデータ数は40万未満です。ジョイントテーブルの場合、最後にページングされたデータをフェッチすると、速度は約3秒に達しました。ついに問題が順番に現れたことがわかりました。
ここに画像の説明を挿入ここに画像の説明を挿入
ここに画像の説明を挿入
ご覧のとおり、order byを使用すると、クエリ速度が10分の1になります。
order byが使用される場合、mysqlはUsing filesortを使用します。これは、インデックスに加えて追加の外部ソートアクションが必要であることを意味します。Aidは主キーインデックスであり、使用されません。
検索した後、order byフィールドでインデックスを使用する場合、selectフィールドはorder byと一致している必要があることが
ここに画像の説明を挿入
ここに画像の説明を挿入
わかりました。この場合、データ期間全体をクエリし、orderbyを使用して並べ替えることができなくなります。配置できないため、必要な列にインデックスが付けられます。現時点では、最初に主キーIDのみをクエリでき、特定のページのデータを取得した後、inクエリを使用してすべてのデータをクエリします。

select * from ask_question where aid in(select t.aid from(select aid from ask_question limit 30000,10)t);

ご覧のとおり、doubleサブクエリが使用されています。これは、mysqlがサブクエリで制限を使用できないことを規定しているためですが、ワードクエリでサブクエリのレイヤーをネストするのに十分です。

おすすめ

転載: blog.csdn.net/u012830303/article/details/82256024