python - インデックスとpymysqlモジュール

1.インデックス

1.1インデックス作品

1.インデックスとは何ですか? - カタログ

インデックスが記憶段にテーブルを構築ストレージ構造で、クエリの時間を短縮することができます。

2.重要性の指標は:

10の識字率:1、すべての読み取り(クエリ)は、速度が不可欠です。

原則3.インデックス:

ブロックディスク先読み原則

Fでの行のために:ファイルの読み取り操作に相当

4096のバイトを格納することができ、各インデックスブロック

ioは動作時間を読んでハードディスクがはるかに長い読み書きするIOの数を減らすために、できるだけ多くの命令を実行するCPUがデータを解決すべき主な問題であるよりも、非常に長いです。

1.2データベースストレージ

1.ストレージ・データベース:

  • 1.新しいデータ構造を - ツリー

    短所:一端のみになりやすいデータ、低速リード(IO動作を複数回)で得られました。

  • 2.バランスの取れた木のバランスツリー - B木

    短所:大きなデータ長を格納するが、データの限られた数本の比較的大きい高さを引き起こして、格納することができ、読み取り効率が低いです。

  • bツリーの改善に基づいて3 - B +ツリー

    • 1.分岐ルートノードとしないメモリ内の実際のデータ、ルートとの分岐は、インデックスについての追加情報を格納することができるように、ツリーの高さを減少させる、全ての実際のデータは、リーフノードに格納されます。
    • クエリに双方向鎖構造、条件の便利な範囲に参加する、リーフノード間2.。

全て4.mysql高さB +ツリーインデックスの層のうち3に実質的に:

  • 操作の数は非常に安定している1.io
  • お問い合わせの範囲2.賛成

5.効率指標に影響しますどのような - 木の高さを?

  • 1.できるだけ短く索引付けされた列を選択する列のインデックスを作成
  • 2.高いカラム内蔵インデックス、インデックスを作成するのに適していない10%以上の繰り返し率を、区別します。

1.3クラスタ化インデックスとセカンダリインデックス

  • クラスタ化インデックスとセカンダリインデックス共存:InnoDB内で

    クラスタ化インデックス - 主キー、速く

    • 唯一の主キーは、クラスタ化インデックスであります

    • データは、ツリー構造のリーフノードに直接格納されます

    セカンダリインデックス - すべての主キーのインデックスに加えて、セカンダリインデックスがあり、遅く

    • データが直接ツリーに格納されていません

  • MyISAMテーブルでは:のみセカンダリインデックス、クラスタ化インデックスがありません

種の1.4インデックス

1.インデックスカテゴリ:

  • 主キー、主キー、クラスタ化インデックス、制約の影響:唯一の非ヌル+

    主キー

  • ユニークなインデックスが付属していますと、セカンダリインデックス、制約の影響です:のみ

    唯一の労働組合

  • インデックスがセカンダリインデックス、無結合効果であります

    共同インデックス

注意:主キー、ユニークインデックス:三つのカテゴリーに分け、主要な項目によると、

主キー、主キー、ユニーク、ユニークな共同、インデックス、共同インデックス:セグメントの6種類があります。

インデックスを作成するには、変更後にインデックスを作成する方法の2見て

テーブルの上にインデックスインデックス名を作成します(フィールド)

インデックスの削除:テーブル名にインデックスインデックス名をドロップします。

3.インデックスが役割を再生する方法ですか?

表から選択*ここで、ID = XXXXX。

  • お問い合わせを電子メールで送信するための条件として:
    • 際、確かに遅いインデックスを追加しないでください
    • Queryフィールドも遅いインデックスフィールドではありませんが、
  • 際の条件としてID:
    • インデックスなしの場合、IDフィールド、低効率
    • idフィールドは、インデックスをした後、高効率

その理由は、1.5の有効な指標ではありません

1.理由のインデックスが有効にならないように:

<1>データの広い範囲を照会します

関連の範囲は:

  • 1. <> = <=!=(!=はほぼ指数をヒットしません)

  • 2.betweenと

    表年齢制限0,5によって順*を選択します。

    表どこID 1000000と1000005の間から選択*;

  • 3.like

    • インデックスの大規模な範囲の結果が反映されません。
    • インデックスは効果のABC%を取る場合は、%ABCインデックスが有効になりません。

コンテンツの差別が高くない場合は、<2>、インデックスが有効になりません。

  • 例えば:name行

<3>インデックス列の条件は計算に参加することはできません

  • 選択* ID * 10 = 1000000どこS1から、インデックスが有効になりません。

<4> 2つのクエリ条件の内容

  • そして:コンテンツと状態が終了すると、優先度、およびより良好なツリー構造、照会する(効率が高くなります)。両方の条件が小さい、狭い背圧条件の最初の完全な範囲の条件を完了するために満たされています。

    • どこのid = 1000000と電子メール= 'eva1000000 @ oldboy S1' から*を選択します。
  • または:または条件と、それが最適化されたが、今度は左から右への条件に従ってフィルタリングされることはありません。

    条件またはすべての列で、これらの条件の指標でヒットするには、インデックス付きの列です。

    • どこのid = 1000000または電子メール= S1から* 'oldboy @ eva1000000' を選択します。

<5>ジョイントインデックス

関節のインデックスを作成します(ID、名前、電子メール)S1にインデックスを作成するind_mix。

  • select * from s1 where id =1000000 and email = 'eva1000000@oldboy';   能命中索引
  • 1.インデックスが共同インデックスに効果や状態になりません場合:

    どこのid = 1000000または電子メール= S1から*「oldboy @ eva1000000」を選択し、インデックスをヒットしません

  • 2.最も左接頭原則:インデックスを作成するときに、関節指数を、条件が最初のインデックス列が含まれている必要があります。

    select * from s1 where id =1000000;    能命中索引
    select * from s1 where email = 'eva1000000@oldboy';  不能命中索引
    
    # 联合索引 (a,b,c,d)
    a,b 、 a,c  、 a  、 a,d  、 a,b,d  、 a,c,d  、 a,b,c,d # 等含有a索引的都能命中索引
    # 不含a索引的其他索引都不能命中。
  • 瞬間から条件を通じて3.、ファジー・マッチングを表示されるようになった、インデックスが無効になり

    select * from s1 where id >1000000 and email = 'eva1000001@oldboy';   不能命中索引
    
    select * from s1 where id =1000000 and email like 'eva%';    能命中引

2.ときのジョイントインデックス?

  • のみ、インデックスBのABC条件ではないだろうというとき、Cの単一の列のインデックス。

単一列のインデックス3.:

  • カラムがインデックスされる高い区別を選択する条件は、カラム、できるだけ条件の範囲の計算に関与しない、コネクタの条件として使用します

4.または複数の条件を接続します:

  • それぞれに関連する、またはすべての列に対して上記条件(単一列インデックス)を満たすに基づいてインデックスを作成します。

いくつかの1.6索引用語

1.カバレッジ・インデックス

私たちは、クエリの条件としてインデックスを使用している場合は、クエリが完了した後、テーブルに戻ってチェックする必要はありません、それはインデックスで覆われています。

ID = 1000000 S1から選択IDを説明します。
ID> 1000000 S1から選択数(ID)を説明。

2.組み合わせ指数

同時に発効2のインデックスを作成するため、SQLの状態に、それぞれ二つのフィールドにインデックスを作成し、この時間の両方のインデックスは、連結インデックスとなっています

実施の3.計画を説明します

あなたは、SQL文の実行にSQL文を実行する前に知りたい場合は、実行計画を使用することができます。

# 情况1:
如果有30000000条数据,使用sql语句查询需要20s,
explain sql语句   --> 并不会真正的执行sql,而是会给你列出一个执行计划
# 情况2:
        20条数据 --> 30000000
            explain sql

4.提言

<1>テーブルを構築するためには、SQLステートメントを使用する際の注意:

  • 文字の代わりにVARCHAR
  • でも、テーブルの代わりに、サブクエリ
  • 前面に固定長フィールド:テーブルを作成する場合

<2> UTF8与utf8mb4:

  • 多くの珍しいと珍しい単語として、絵文字表現をコード化する中国の全額を表示するUTF8ことができないように、ならびに任意の新しいのUnicode文字と(絵文字は、iOSとAndroid携帯電話で一般的な、特別なUnicodeエンコーディングは、あります)
  • utf8mb4全額が中国のエンコーディングを表示することができます

あなたが文字化け後で使用するUTF8が発生した場合は、utf8mb4を変更するためにコード化することができます。

1.7基本的な手順スロークエリの最適化

  1. 本当に遅い、SQL_NO_CACHEを設定するために注意を払うかどうかを確認するために最初に実行

1.where単一のテーブルの検索条件、ロック最小リターンレコードテーブル。これは、単一のテーブルには、最高の区別がフィールドを参照して、個別に各フィールドを照会するクエリは、テーブル内のレコードの数に適用されている場合、最初から最小のテーブル検索を返すことを意味
するかどうか、実行計画を表示2.explain (ロック少ないレコード・テーブル・クエリの最初から)期待してステップ1は、一貫性のある
ソートの調査が優先テーブルせるために、SQL文の形式によって3.order制限
4.ビジネス側の使用シナリオ理解
参照5.いくつかのインデックス化インデックス化を原則
6.結果は期待が0の分析から引き続き満たしていない観察

スローログ管理1.8

1.スローログイン

  • 実行時間> 10
  • ミスインデックス
  • ログファイルのパス

2.構成:

  • メモリ

    「%クエリ%」のような変数を表示。

    「%クエリの%」のような変数を表示。

    グローバル変数名=値を設定します

  • プロファイル

    mysqld --defaults-ファイル= 'E:\ wupeiqi \ mysqlの-5.7.16-winx64 \ mysqlの-5.7.16-winx64私-default.ini \'

    my.confコンテンツ:

    • slow_query_log = ON
    • slow_query_log_file = D:/ ....

    注意:設定ファイルを変更した後、サービスを再起動する必要があります

3.ログ管理

します。https://www.cnblogs.com/Eva-J/articles/10126413.html#_label8 URLを参照してください。

2. pymysqlモジュール

2.1 pymysqlモジュール

パイソン同等のクライアント

import pymysql
conn = pymysql.connect(host='127.0.0.1', user='root', password="123",database='day40') # python与mysql连接
cur = conn.cursor()   # 创建 数据库操作符:游标

# 增加数据
cur.execute('insert into employee(emp_name,sex,age,hire_date) '
            'values ("郭凯丰","male",40,20190808)')

# 删除数据
cur.execute('delete from employee where id = 18')
conn.commit() # 提交
conn.close()

# 查询数据
import pymysql
conn = pymysql.connect(host='127.0.0.1', user='root', password="123",database='day40')
cur = conn.cursor(pymysql.cursors.DictCursor)   # 想要输出为字典格式时加上pymysql.cursors.DictCursor
cur.execute('select * from employee where id > 10')
ret = cur.fetchone()  # 查询第一条数据
print(ret['emp_name'])
ret = cur.fetchmany(5) # 查询5条数据
ret = cur.fetchall()  # 查询所有的数据
print(ret)
conn.close()

2.2データのバックアップとトランザクション

1.論理バックアップデータベース

構文:mysqldumpを-h -uユーザ名-pパスワードサーバのデータベース名> .SQLバックアップ・ファイル

#示例:
#单库备份
mysqldump -uroot -p123 db1 > db1.sql
mysqldump -uroot -p123 db1 table1 table2 > db1-table1-table2.sql

#多库备份
mysqldump -uroot -p123 --databases db1 db2 mysql db3 > db1_db2_mysql_db3.sql

#备份所有库
mysqldump -uroot -p123 --all-databases > all.sql

2.データ復旧

#方法一:
[root@egon backup]# mysql -uroot -p123 < /backup/all.sql

#方法二:
mysql> use db1;
mysql> SET SQL_LOG_BIN=0;   #关闭二进制日志,只对当前session生效
mysql> source /root/db1.sql

3.トランザクション

begin;  # 开启事务
select * from emp where id = 1 for update;  # 查询id值,for update添加行锁;
update emp set salary=10000 where id = 1; # 完成更新
commit; # 提交事务(解锁)

3つのキーポイントに注意してください:

  • ベギン
  • コミット
  • 更新のための

2.3 SQLインジェクション

create table userinfo(
id int primary key auto_increment,
name char(12) unique not null,
password char(18) not null
)

insert into userinfo(name,password) values('alex','alex3714')

# 用户名和密码到数据库里查询数据
# 如果能查到数据 说明用户名和密码正确
# 如果查不到,说明用户名和密码不对
username = input('user >>>')
password = input('passwd >>>')
sql = "select * from userinfo where name = '%s' and password = '%s'"%(username,password)
print(sql)

-- :表示注释掉--之后的sql语句
select * from userinfo where name = 'alex' ;-- and password = '792164987034';
select * from userinfo where name = 219879 or 1=1 ;-- and password = 792164987034;
select * from userinfo where name = '219879' or 1=1 ;-- and password = '792164987034';

上記の状況は、セキュリティ上のリスクがあるので、SQLインジェクションと呼ばれているこのような状況のセキュリティ上のリスクがあり、クエリ結果に入力することができます。

SQL文を継ぐない自分自身に、pymysqlを使用する場合、SQLインジェクションを防ぐため、そして自分がMySQLのモジュールスプライシングを手放すために。

import pymysql

conn = pymysql.connect(host = '127.0.0.1',user = 'root',
                       password = '123',database='day41')
cur = conn.cursor()
username = input('user >>>')
password = input('passwd >>>')
sql = "select * from userinfo where name = %s and password = %s"
cur.execute(sql,(username,password))  # 让mysql模块去拼接
print(cur.fetchone())
cur.close()
conn.close()

おすすめ

転載: www.cnblogs.com/yangjie0906/p/11404865.html