Day46:数据库引擎、索引、pymysql

本文介绍了MySQL中的存储引擎概念及其常见类型,如MyISAM、InnoDB等,并详细讲解了索引的作用、创建方法及其实验效果。此外还简单介绍了Python操作MySQL的模块pymysql的基本使用。

一、数据库存储引擎

1、存储引擎

mysql中建立的库===>文件夹

库中建立的表===>文件

现实生活中我们用来存储数据的文件应该有不同的类型:比如存文本用txt类型,存表格用excel,存图片用png等。

数据库中的表也应该有不同的类型,表的类型不同,会对应mysql不同的存取机制,表类型又称为存储引擎。

存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方
法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和
操作此表的类型)。

在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。而MySql
数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据
自己的需要编写自己的存储引擎。

2、mysql支持的存储引擎

mysql> show engines\G;  #查看所有支持的存储引擎
mysql> show variables like '%storage_engine%';   #查看正在使用的存储引擎

MySQL常用的存储引擎

MyISAM存储引擎
由于该存储引擎不支持事务、也不支持外键,所以访问速度较快。因此当对事务完整性没有要求并以访问为主的应用适合使用该存储引擎。

InnoDB存储引擎(主要使用
由于该存储引擎在事务上具有优势,即支持具有提交、回滚及崩溃恢复能力等事务特性,所以比MyISAM存储引擎占用更多的磁盘空间。因此当需要频繁的更新、删除操作,同时还对事务的完整性要求较高,需要实现并发控制,建议选择。

MEMORY
MEMORY存储引擎存储数据的位置是内存,因此访问速度最快,但是安全上没有保障。适合于需要快速的访问或临时表。

BLACKHOLE
黑洞存储引擎,可以应用于主备复制中的分发主库。

3、使用存储引擎

方法1:建表时指定

mysql> create table innodb_t1(id int,name char)engine=innodb;
mysql> create table innodb_t2(id int)engine=innodb;
mysql> show create table innodb_t1;
mysql> show create table innodb_t2;

方法2:在配置文件中指定默认的存储引擎

/etc/my.cnf
[mysqld]
default-storage-engine=INNODB
innodb_file_per_table=1

查看

[root@egon db1]# cd /var/lib/mysql/db1/
[root@egon db1]# ls
db.opt  innodb_t1.frm  innodb_t1.ibd  innodb_t2.frm  innodb_t2.ibd

二、索引

1、索引简介

索引在MySQL中也叫做“键”,是存储引擎用于快速找到记录的一种数据结构。索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要。

索引优化应该是对查询性能优化最有效的手段了。
索引能够轻易将查询性能提高好几个数量级。
索引相当于字典的音序表,如果要查某个字,如果不使用音序表,则需要从几百页中逐页去查。

索引特点:创建与维护索引会消耗很多时间与磁盘空间,但查询速度大大提高!

2、索引语法

创建索引

复制代码
--创建表时
--语法:
    CREATE TABLE 表名 (
                字段名1  数据类型 [完整性约束条件…],
                字段名2  数据类型 [完整性约束条件…],
                [UNIQUE]   INDEX | KEY
                [索引名]  (字段名[(长度)]  [ASC |DESC])
                );

--------------------------------
--创建普通索引示例:

    CREATE TABLE emp1 (
        id INT,
        name VARCHAR(30) ,
        resume VARCHAR(50),
        INDEX index_emp_name (name)
    --KEY index_dept_name (dept_name)
        );

--创建唯一索引示例:

    CREATE TABLE emp2 (
        id INT,
        name VARCHAR(30) ,
        bank_num CHAR(18) UNIQUE ,
        resume VARCHAR(50),
        UNIQUE INDEX index_emp_name (name)
        );

--创建全文索引示例:

    CREATE TABLE emp3 (
        id INT,
        name VARCHAR(30) ,
        resume VARCHAR(50),
        FULLTEXT INDEX index_resume (resume)
        );

--创建多列索引示例:

    CREATE TABLE emp4 (
        id INT,
        name VARCHAR(30) ,
        resume VARCHAR(50),
        INDEX index_name_resume (name,resume)
        );
---------------------------------
复制代码

添加和删除索引

复制代码
---添加索引

    ---CREATE在已存在的表上创建索引
      CREATE  [UNIQUE]  INDEX  索引名
              ON 表名 (字段名[(长度)]  [ASC |DESC]) ;
    
    ---ALTER TABLE在已存在的表上创建索引
    
      ALTER TABLE 表名 ADD  [UNIQUE] INDEX
                    索引名 (字段名[(长度)]  [ASC |DESC]) ;
    
    
      CREATE INDEX index_emp_name on emp1(name);
      ALTER TABLE emp2 ADD UNIQUE INDEX index_bank_num(band_num);

-- 删除索引
    
    语法:DROP INDEX 索引名 on 表名
    
    DROP INDEX index_emp_name on emp1;
    DROP INDEX bank_num on emp2;
复制代码

3、索引测试实验

复制代码
--创建表
create table Indexdb.t1(id int,name varchar(20));

--存储过程

delimiter $$
create procedure autoinsert() 
BEGIN
declare i int default 1;
while(i<500000)do
insert into Indexdb.t1 values(i,'yuan');
set i=i+1;
end while;
END$$

delimiter ;

--调用函数
call autoinsert();

-- 花费时间比较:
-- 创建索引前
   select * from Indexdb.t1 where id=300000;--2.42s
-- 添加索引 
   create index index_id on Indexdb.t1(id);
-- 创建索引后
   select * from Indexdb.t1 where id=300000;--0.09s
复制代码

 三、pymysql

pymysql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同。

一、下载安装:

pip3 install pymysql

二、使用

1、执行SQL 
复制代码
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pymysql
  
# 创建连接
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
# 创建游标
cursor = conn.cursor()
  
# 执行SQL,并返回收影响行数
effect_row = cursor.execute("update hosts set host = '1.1.1.2'")
  
# 执行SQL,并返回受影响行数
#effect_row = cursor.execute("update hosts set host = '1.1.1.2' where nid > %s", (1,))
  
# 执行SQL,并返回受影响行数
#effect_row = cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",1),("1.1.1.11",2)])
  
  
# 提交,不然无法保存新建或者修改的数据
conn.commit()
  
# 关闭游标
cursor.close()
# 关闭连接
conn.close()
复制代码
2、获取新创建数据自增ID
复制代码
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pymysql
  
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
cursor = conn.cursor()
cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",1),("1.1.1.11",2)])
conn.commit()
cursor.close()
conn.close()
  
# 获取最新自增ID
new_id = cursor.lastrowid
复制代码
3、获取查询数据
复制代码
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pymysql
  
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
cursor = conn.cursor()
cursor.execute("select * from hosts")
  
# 获取第一行数据
row_1 = cursor.fetchone()
  
# 获取前n行数据
# row_2 = cursor.fetchmany(3)
# 获取所有数据
# row_3 = cursor.fetchall()
  
conn.commit()
cursor.close()
conn.close()
复制代码

注:在fetch数据时按照顺序进行,可以使用cursor.scroll(num,mode)来移动游标位置,如:

  • cursor.scroll(1,mode='relative')  # 相对当前位置移动
  • cursor.scroll(2,mode='absolute') # 相对绝对位置移动
4、fetch数据类型

  关于默认获取的数据是元祖类型,如果想要或者字典类型的数据,即:

复制代码
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pymysql
  
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
  
# 游标设置为字典类型
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
r = cursor.execute("call p1()")
  
result = cursor.fetchone()
  
conn.commit()
cursor.close()
conn.close()
复制代码

转载于:https://www.cnblogs.com/zzn91/p/7300806.html

<think>嗯,用户现在想学习如何使用Pandas进行数据导入导出,特别是CSV/Excel文件的读写和数据库交互。同时,他们希望将清洗后的数据保存为CSV并导入数据库。我需要结合之前的对话和提供的引用来构建一个全面的回答。 首先,回顾用户之前的问题,他们之前学习了数据合并和分组分析,现在转向数据读写和数据库交互。引用中提到的内容,比如使用read_csv、read_excel,以及SQLAlchemy连接数据库,这些都是需要覆盖的重点。 用户提到想了解read_csv、to_csv、read_excel的用法,以及read_sql和to_sql配合SQLAlchemy。根据引用[4],有具体的代码示例,比如设置显示选项、处理不同编码,这些应该包含在回答中。同时,引用[1]和[2]提到了使用SQLAlchemy建立数据库连接,需要详细说明步骤,包括安装必要的库如pandas、sqlalchemy、pymysql。 需要注意用户可能遇到的常见问题,比如编码问题(如gbk)、处理大文件时的分块读取,这些在引用[4]和[5]中有提及。例如,读取CSV时指定编码格式,使用nrows或chunksize参数。此外,数据清洗后的格式设置,如百分数和千分位分隔符,引用[5]中的内容可以整合到数据清洗部分。 关于数据库交互部分,用户可能需要知道如何安装依赖库,创建引擎,以及使用to_sql时的参数,比如if_exists。引用[1]提到to_sql方法,需要说明如何避免重复数据,比如使用replace或append模式。 练习部分需要具体步骤,用户可能希望有一个完整的流程,从读取数据到清洗再到保存和导入数据库。示例数据应该简单明了,方便用户理解。同时,可能的问题如处理NaN值或数据库连接错误,应该在注意事项中提到。 最后,相关问题需要覆盖用户可能深入的问题,比如处理大数据、数据库性能优化、数据清洗技巧和加密导出,这些都是用户在实践过程中可能遇到的后续问题。</think>### 使用Pandas实现数据导入导出与数据库交互详解 --- #### 一、文件读写基础操作 **1. CSV文件读写** ```python import pandas as pd # 读取CSV(处理中文编码) df = pd.read_csv('data.csv', encoding='utf-8', # 或gbk(根据文件编码选择) dtype={'id': str}, # 指定列数据类型 na_values=['NULL']) # 自定义缺失值标识[^4] # 写入CSV(控制输出格式) df.to_csv('cleaned_data.csv', index=False, # 不保存索引 columns=['id', 'name', 'sales'], # 选择输出列 float_format='%.2f') # 保留两位小数[^5] ``` **2. Excel文件读写** ```python # 读取Excel(多Sheet处理) with pd.ExcelFile('data.xlsx') as xls: df_sheet1 = pd.read_excel(xls, 'Sheet1', skiprows=2) # 跳过前两行 df_sheet2 = pd.read_excel(xls, 'Sheet2', usecols='A:C') # 仅读取A-C列 # 写入Excel(多Sheet输出) with pd.ExcelWriter('output.xlsx') as writer: df.to_excel(writer, sheet_name='清洗后数据', index=False) df_analysis.to_excel(writer, sheet_name='分析结果') ``` --- #### 二、数据库交互方法 **1. 数据库连接配置** ```python from sqlalchemy import create_engine # 创建MySQL连接引擎 engine = create_engine('mysql+pymysql://user:password@host:port/dbname?charset=utf8mb4') # PostgreSQL示例:postgresql+psycopg2://user:password@host/dbname[^2] ``` **2. 数据库读写操作** ```python # 读取SQL数据(支持复杂查询) query = ''' SELECT o.order_id, c.region FROM orders o LEFT JOIN customers c ON o.customer_id = c.id WHERE o.amount > 1000 ''' df_db = pd.read_sql(query, engine)[^1] # 写入数据库(自动建表) df.to_sql('cleaned_data', engine, if_exists='replace', # 覆盖/追加模式 index=False, chunksize=1000) # 分批写入提升性能[^1] ``` --- #### 三、完整实践流程 **1. 数据清洗保存案例** ```python # 步骤1:读取原始数据 raw_data = pd.read_csv('dirty_data.csv', encoding='gbk') # 步骤2:数据清洗(示例) cleaned_data = raw_data.dropna(subset=['关键列']) \ .assign(日期列=lambda x: pd.to_datetime(x['日期列']), 金额列=lambda x: x['金额列'].round(2)) \ .query('金额列 > 0') # 步骤3:保存清洗结果 cleaned_data.to_csv('cleaned_data.csv', index=False) # 步骤4:写入数据库 engine = create_engine('mysql+pymysql://user:password@localhost/sales_db') cleaned_data.to_sql('clean_orders', engine, if_exists='append', index=False) ``` --- #### 四、关键注意事项 1. **编码问题处理** - CSV文件读取时若出现`UnicodeDecodeError`,尝试`encoding='gb18030'`(兼容GBK扩展) - 数据库连接字符串需明确指定`charset=utf8mb4`以支持emoji等特殊字符[^2] 2. **大文件优化技巧** - 使用`chunksize`参数分块读取: ```python for chunk in pd.read_csv('large_file.csv', chunksize=50000): process(chunk) ``` - 数据库写入时启用`method='multi'`加速: ```python df.to_sql(..., method='multi', chunksize=5000) ``` 3. **数据格式化增强** ```python # 生成报告时美化数字格式 report_df = cleaned_data.assign( 金额=lambda x: x['金额'].map('¥{:,.2f}'.format), 占比=lambda x: x['占比'].map('{:.2%}'.format) )[^5] ``` --- #### 五、扩展应用场景 1. **跨数据库迁移** ```python # 从MySQL迁移到PostgreSQL src_engine = create_engine('mysql+pymysql://...') dst_engine = create_engine('postgresql://...') pd.read_sql('SELECT * FROM src_table', src_engine) \ .to_sql('dst_table', dst_engine, if_exists='replace') ``` 2. **动态参数化查询** ```python from sqlalchemy import text params = {'start_date': '2023-01-01', 'min_amount': 5000} query = text('SELECT * FROM orders WHERE order_date > :start_date AND amount > :min_amount') pd.read_sql(query, engine, params=params) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值