MySQL知识点记录(二)

2018-10-24  本文已影响0人  VienFu

Django连接MySQL

  1. 配置数据库连接,其实就是修改项目下的settings.py文件,具体配置样式可参照下图来:
# Database
# https://docs.djangoproject.com/en/1.8/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'zaihui',
        'USER': 'zaihui',
        'PASSWORD': 'Tdi9LyUMke4PXB',
        'HOST': 'zaihuiprodnew.cbzzv8ulixeg.rds.cn-north-1.amazonaws.com.cn',
        'PORT': '3306',
        'OPTIONS': {'charset': 'utf8mb4'},
    },
    'read': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'zaihui',
        'USER': 'zaihui',
        'PASSWORD': 'Tdi9LyUMke4PXB',
        'HOST': 'prod-read-01.cbzzv8ulixeg.rds.cn-north-1.amazonaws.com.cn',
        'PORT': '3306',
        'OPTIONS': {'charset': 'utf8mb4'},
    },
    'data': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'zaihui',
        'USER': 'zaihui',
        'PASSWORD': 'Tdi9LyUMke4PXB',
        'HOST': 'prod-read-02.cbzzv8ulixeg.rds.cn-north-1.amazonaws.com.cn',
        'PORT': '3306',
        'OPTIONS': {'charset': 'utf8mb4'},
    },
    'dw': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'zaihui',
        'USER': 'zaihui',
        'PASSWORD': 'HeFZqyrv78BDfD',
        'HOST': 'local-redshift.cjrxiomjhv1y.cn-north-1.redshift.amazonaws.com.cn',
        'PORT': '25439',
    },
}
  1. 安装数据库驱动
    python2.x:MySQLdb
    python3.x: pymysql
    另外,Django应用程序需要安装mysqlclient
  2. 创建表,并同步到mysql(以django orm的方式举例)
# 首先创建一个model
from django.db.models import Model

class Account(Model):
    uid = UUIDField(default=uuid.uuid4, editable=False, db_index=True)
    phone = CharField(max_length=11, unique=True, db_index=True)
    apisecret = UUIDField(default=uuid.uuid4, editable=False)
    qrcode = UUIDField(default=uuid.uuid4, editable=False)
    birthday = DateField(null=True, db_index=True)
    created_at = DateTimeField(default=datetime.datetime.now, db_index=True)
    updated_at = DateTimeField(auto_now=True, db_index=True)
    phone_verified = BooleanField(default=False)

    def __str__(self):
        return '{}'.format(self.phone)

    @property
    def name(self):
        return self.profile.name

    @property
    def sex(self):
        return self.profile.gender

# 生成mi记录的文件
python manage.py makemigrations

# mi表(同步到数据库)
python manage.py migrate

索引

索引的最左前缀匹配原则:在组合索引中会从左到右依次去查询对应索引的列,在使用查询时不能跳过前面的索引,否则索引不会起作用。

1. 创建索引

结合两种场景来说明:

Django下创建索引

可以在创建表结构的时候设置该列field的参数index_db=True

mysql命令行下创建索引

可以在创建表的时候指定或者之后更改表结构

create table <table_name> (字段名 字段类型,
index(指定的索引字段列))
或者
alter table <table_name> add index index_name(指定的索引字段列)

2. 索引优化

数据量比较大的表才建立索引;
最左匹配特性;
选择区分度较高的列做索引,比如布尔属性的字段就不适合建索引;
建索引的列尽量不要去参与计算;
尽量去扩展索引而不去新建索引;
尽量在whereorder by经常用到的字段建索引;
对于写特别频繁的列不要建索引;

3. 查询优化

尽量避免Like的参数以通配符开头,否则数据库引擎会放弃使用索引而进行全表扫描;
最左前缀匹配原则;
在建立索引的列不要进行计算;
尽量避免使用!= 或 <>操作符,否则数据库引擎会放弃使用索引而进行全表扫描。使用>或<会比较高效;
应尽量避免在where子句中对字段进行null值判断,可以设置默认值为0,确保该列没有null值;
尽量避免使用or操作符,而是采用union all来代替;
避免使用select *
order by语句的优化,可以考虑在该列新建索引;
group by语句的优化,可以通过将不需要的记录在GROUP BY 之前过滤掉;
用 exists 代替 in;
使用 varchar/nvarchar 代替 char/nchar;
能用DISTINCT的就不用GROUP BY;
能用UNION ALL就不要用UNION,UNION ALL不执行SELECT DISTINCT函数,这样就会减少很多不必要的资源;
在Join表的时候使用相当类型的例,并将其索引;

一个MySQL锁的应用

比如在update表中的某个字段时不想被其他线程或事务影响,可以select ... for update然后再update。

上一篇 下一篇

猜你喜欢

热点阅读