完成作业7第二题的代码
This commit is contained in:
parent
8dd5a17062
commit
875a5dcd61
@ -0,0 +1,195 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"id": "30712dff-7471-4a6f-a464-aa4305036b9a",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import pymysql\n",
|
||||
"import random\n",
|
||||
"from tqdm import tqdm\n",
|
||||
"import matplotlib.pyplot as plt\n",
|
||||
"import numpy as np\n",
|
||||
"\n",
|
||||
"N = 20000"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"id": "480e12b1-02a4-4e89-9a13-1b147b075372",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"db = pymysql.connect(\n",
|
||||
" host='127.0.0.1', user='kejingfan', \n",
|
||||
" password='KJF2811879', database='TESTDB'\n",
|
||||
")\n",
|
||||
"cursor = db.cursor()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"id": "91fb704d-4104-4cf1-86cc-5ef7a2f06601",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"sql_statements = [\n",
|
||||
" \"SET profiling = 1;\",\n",
|
||||
" \n",
|
||||
" \"DROP TABLE IF EXISTS passengers_no_index;\",\n",
|
||||
" \"DROP TABLE IF EXISTS passengers_with_index;\",\n",
|
||||
" \"\"\"\n",
|
||||
" CREATE TABLE passengers_no_index (\n",
|
||||
" ID BIGINT PRIMARY KEY,\n",
|
||||
" `Name` VARCHAR (255) NOT NULL,\n",
|
||||
" Phone_number BIGINT NOT NULL,\n",
|
||||
" `Password` VARCHAR (255) NOT NULL,\n",
|
||||
" CHECK (ID REGEXP '^\\\\\\\\d{18}$'),\n",
|
||||
" CHECK (Phone_number REGEXP '^\\\\\\\\d{11}$')\n",
|
||||
" );\n",
|
||||
" \"\"\",\n",
|
||||
" \"\"\"\n",
|
||||
" CREATE TABLE passengers_with_index (\n",
|
||||
" ID BIGINT PRIMARY KEY,\n",
|
||||
" `Name` VARCHAR (255) NOT NULL,\n",
|
||||
" Phone_number BIGINT NOT NULL,\n",
|
||||
" `Password` VARCHAR (255) NOT NULL,\n",
|
||||
" CHECK (ID REGEXP '^\\\\\\\\d{18}$'),\n",
|
||||
" CHECK (Phone_number REGEXP '^\\\\\\\\d{11}$')\n",
|
||||
" );\n",
|
||||
" \"\"\",\n",
|
||||
" \"CREATE INDEX idx_phone_number ON passengers_with_index (Phone_number);\",\n",
|
||||
"]\n",
|
||||
"\n",
|
||||
"for sql in sql_statements:\n",
|
||||
" cursor.execute(sql)\n",
|
||||
"db.commit()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "100a5382",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"操作数据表 passengers_no_index :\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
" 71%|████████████████████████████████████████████████████████████████████████████████ | 14166/20000 [02:56<01:19, 73.12it/s]"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"id_list = random.sample(range(100000000000000000, 1000000000000000000), N)\n",
|
||||
"phone_number_list = random.sample(range(10000000000, 20000000000), N)\n",
|
||||
"\n",
|
||||
"insert_times = {\n",
|
||||
" 'passengers_no_index': [],\n",
|
||||
" 'passengers_with_index': []\n",
|
||||
"}\n",
|
||||
"query_times = {\n",
|
||||
" 'passengers_no_index': [],\n",
|
||||
" 'passengers_with_index': []\n",
|
||||
"}\n",
|
||||
"\n",
|
||||
"for table_name in ['passengers_no_index', 'passengers_with_index']:\n",
|
||||
" print(f\"操作数据表 {table_name} :\")\n",
|
||||
" insert_sql = f'''\n",
|
||||
" INSERT INTO {table_name} (ID, `Name`, Phone_number, `Password`)\n",
|
||||
" VALUES (%s, %s, %s, %s);\n",
|
||||
" '''\n",
|
||||
" query_sql = f'''\n",
|
||||
" SELECT * FROM {table_name}\n",
|
||||
" WHERE Phone_number = %s;\n",
|
||||
" '''\n",
|
||||
" \n",
|
||||
" for i in tqdm(range(N)):\n",
|
||||
" cursor.execute(insert_sql, (id_list[i], 'kejingfan', phone_number_list[i], 'password'))\n",
|
||||
" db.commit()\n",
|
||||
" cursor.execute(\"SHOW PROFILES;\")\n",
|
||||
" profile = cursor.fetchall()[-2]\n",
|
||||
" if \"INSERT INTO\" in profile[2]:\n",
|
||||
" insert_times[table_name].append(profile[1])\n",
|
||||
"\n",
|
||||
" cursor.execute(query_sql, (phone_number_list[random.randint(0, i)],))\n",
|
||||
" cursor.execute(\"SHOW PROFILES;\")\n",
|
||||
" profile = cursor.fetchall()[-1]\n",
|
||||
" if \"SELECT * FROM\" in profile[2]:\n",
|
||||
" query_times[table_name].append(profile[1])\n",
|
||||
"\n",
|
||||
"cursor.close()\n",
|
||||
"db.close()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "3783d8dd",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def get_average_per_n(data, n):\n",
|
||||
" return [np.mean(data[i:i + n]) for i in range(0, len(data), n)]\n",
|
||||
"\n",
|
||||
"avg_insert_times_no_index = get_average_per_n(insert_times['passengers_no_index'], 100)\n",
|
||||
"avg_insert_times_with_index = get_average_per_n(insert_times['passengers_with_index'], 100)\n",
|
||||
"avg_query_times_no_index = get_average_per_n(query_times['passengers_no_index'], 100)\n",
|
||||
"avg_query_times_with_index = get_average_per_n(query_times['passengers_with_index'], 100)\n",
|
||||
"\n",
|
||||
"plt.figure(figsize=(14, 7))\n",
|
||||
"\n",
|
||||
"plt.subplot(2, 1, 1)\n",
|
||||
"plt.plot(range(len(avg_insert_times_no_index)), avg_insert_times_no_index, label='No Index Insert Time')\n",
|
||||
"plt.plot(range(len(avg_insert_times_with_index)), avg_insert_times_with_index, label='With Index Insert Time')\n",
|
||||
"plt.xlabel('Number of Insertions (in hundreds)')\n",
|
||||
"plt.ylabel('Time (s)')\n",
|
||||
"plt.title('Average Insert Time vs Number of Insertions')\n",
|
||||
"plt.legend()\n",
|
||||
"\n",
|
||||
"plt.subplot(2, 1, 2)\n",
|
||||
"plt.plot(range(len(avg_query_times_no_index)), avg_query_times_no_index, label='No Index Query Time')\n",
|
||||
"plt.plot(range(len(avg_query_times_with_index)), avg_query_times_with_index, label='With Index Query Time')\n",
|
||||
"plt.xlabel('Number of Queries (in hundreds)')\n",
|
||||
"plt.ylabel('Time (s)')\n",
|
||||
"plt.title('Average Query Time vs Number of Queries')\n",
|
||||
"plt.legend()\n",
|
||||
"\n",
|
||||
"plt.tight_layout()\n",
|
||||
"plt.show()"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3 (ipykernel)",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.11.9"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 5
|
||||
}
|
24
Assignments/Assignment7/src/Problem2/db.sql
Normal file
24
Assignments/Assignment7/src/Problem2/db.sql
Normal file
@ -0,0 +1,24 @@
|
||||
DROP TABLE IF EXISTS passengers_no_index;
|
||||
DROP TABLE IF EXISTS passengers_with_index;
|
||||
|
||||
CREATE TABLE passengers_no_index (
|
||||
ID BIGINT PRIMARY KEY,
|
||||
`Name` VARCHAR(255) NOT NULL,
|
||||
Phone_number BIGINT UNIQUE NOT NULL,
|
||||
`Password` VARCHAR(255) NOT NULL,
|
||||
CHECK (ID REGEXP '^\d{18}$'),
|
||||
CHECK (Phone_number REGEXP '^\d{11}$')
|
||||
);
|
||||
|
||||
CREATE TABLE passengers_with_index (
|
||||
ID BIGINT PRIMARY KEY,
|
||||
`Name` VARCHAR(255) NOT NULL,
|
||||
Phone_number BIGINT UNIQUE NOT NULL,
|
||||
`Password` VARCHAR(255) NOT NULL,
|
||||
CHECK (ID REGEXP '^\d{18}$'),
|
||||
CHECK (Phone_number REGEXP '^\d{11}$')
|
||||
);
|
||||
|
||||
CREATE INDEX idx_phone_number ON passengers_with_index (Phone_number);
|
||||
|
||||
SET profiling = 1;
|
229
Assignments/Assignment7/src/Problem2/main.ipynb
Normal file
229
Assignments/Assignment7/src/Problem2/main.ipynb
Normal file
File diff suppressed because one or more lines are too long
100001
Assignments/Assignment7/src/Problem2/performance_times.csv
Normal file
100001
Assignments/Assignment7/src/Problem2/performance_times.csv
Normal file
File diff suppressed because it is too large
Load Diff
14
Assignments/Assignment7/src/Problem2/requirements.txt
Normal file
14
Assignments/Assignment7/src/Problem2/requirements.txt
Normal file
@ -0,0 +1,14 @@
|
||||
blinker==1.8.1
|
||||
cffi==1.16.0
|
||||
click==8.1.7
|
||||
configparser==7.0.0
|
||||
cryptography==42.0.6
|
||||
Flask==3.0.3
|
||||
itsdangerous==2.2.0
|
||||
Jinja2==3.1.3
|
||||
MarkupSafe==2.1.5
|
||||
pycparser==2.22
|
||||
PyMySQL==1.1.0
|
||||
Werkzeug==3.0.2
|
||||
jupyterlab
|
||||
notebook
|
Loading…
x
Reference in New Issue
Block a user