mysql创建索引

数据库优化 - SQL优化

送分小仙女□ 提交于 2019-12-03 06:42:37
前面一篇文章从实例的角度进行数据库优化,通过配置一些参数让数据库性能达到最优。但是一些“不好”的SQL也会导致数据库查询变慢,影响业务流程。本文从SQL角度进行数据库优化,提升SQL运行效率。 判断问题SQL 判断SQL是否有问题时可以通过两个表象进行判断: 系统级别表象 CPU消耗严重 IO等待严重 页面响应时间过长 应用的日志出现超时等错误 可以使用 sar 命令, top 命令查看当前系统状态。 也可以通过 Prometheus、Grafana 等监控工具观察系统状态。(感兴趣的可以翻看我之前的文章) SQL语句表象 冗长 执行时间过长 从全表扫描获取数据 执行计划中的rows、cost很大 冗长的SQL都好理解,一段SQL太长阅读性肯定会差,而且出现问题的频率肯定会更高。更进一步判断SQL问题就得从执行计划入手,如下所示: 执行计划告诉我们本次查询走了全表扫描 Type=ALL ,rows很大(9950400)基本可以判断这是一段"有味道"的SQL。 获取问题SQL 不同数据库有不同的获取方法,以下为目前主流数据库的慢查询SQL获取工具 MySQL 慢查询日志 测试工具loadrunner Percona公司的ptquery等工具 Oracle AWR报告 测试工具loadrunner等 相关内部视图如v$sql、v$session_wait等 GRID

discuz论坛配置开启Sphinx全文搜索

孤人 提交于 2019-12-03 05:47:36
技术简介: Sphinx是一个基于SQL的全文检索引擎,可以结合MySQL,PostgreSQL做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。Sphinx特别为一些脚本语言设计搜索API接口,如PHP,Python,Perl,Ruby等,同时为MySQL也设计了一个存储引擎插件。 Sphinx 单一索引最大可包含1亿条记录,在1千万条记录情况下的查询速度为0.x秒(毫秒级)。Sphinx创建索引的速度为:创建100万条记录的索引只需 3~4分钟,创建1000万条记录的索引可以在50分钟内完成,而只包含最新10万条记录的增量索引,重建 如果用到sphinx,全文索引交给sphinx来做,sphinx返回含有该word的ID号,然后用该ID号直接去数据库准确定位那些数据,整个过程如下图:一次只需几十秒。 因为sphinx默认不支持中文索引及检索,而coreseek基于sphinx开发了coreseek全文检索服务器,它提供了为sphinx设计的中文分词包libmmseg包含mmseg中文分词,是目前用的最多的sphinx中文检索。在没有sphinx之前,mysql数据库要对海量的文章中的词进行全文索引,一般用的语句例如:SELECT *** WHERE *** LIKE '%word%';这样的LIKE查询,并且再结合通配符%

1031 回顾

会有一股神秘感。 提交于 2019-12-03 05:13:25
目录 pymysql 介绍 安装 连接 执行 查 增删改 sql注入 原因 解决的方式 csrf攻击 索引 索引的作用 类比:字典中的目录 底层采用的数据结构 索引本质 索引的分类 主键索引 唯一索引 普通索引 联合(组合)索引 索引命中 explain 慢日志 查询 tee pymysql 介绍 python操作mysql的模块 安装 pip install pymysql 连接 import conn = pymysql conn = pymysql.connect(host= 主机名,user = 用户名, password = 密码,database = 数据库名) cursor = conn.cursor() // 返回的是元组中套元组 cursor = conn.cursor(cursor=pymysql.cursors.dictcursor) // 返回的是列表中套字典 执行 执行sql语句 cursor.execupt(sql) 查 fetchcall() :获取多个,返回 列表套字典 fetchone() :获取一个,返回 字典 fetchmany(size) :获取指定数量,返回 列表套字典 增删改 sql='' cursor.execute(sql,(1,2,3)) // 添加1个 cursor.executemany(sql,[(1,2,3),(1,2,3)

读高性能MySQL的笔记

寵の児 提交于 2019-12-03 05:10:53
1. B-Tree索引(创建多索引时,索引列的顺序非常重要,第一个索引列是最重要的) a. B-Tree索引适用于全值匹配(和所有索引列匹配)、匹配最左前缀(只使用第一项索引列)、匹配列前缀(匹配某个索引列的开头部分,如查找以J开头的姓的人)、匹配范围值(索引列的范围,从xx到xx)、精确匹配某一列并范围匹配某一列 b. 一些限制:必须要从最左的索引列开始查找,否则无法使用索引,比如如果不使用第一列索引列而只使用第二第三索引列,将无效;如果查询中有某个索引列使用范围查找而不是精准匹配,则其右边的索引列都无法使用索引 2. 哈希索引hash index a. 索引自身只需存储对应的哈希值,所以索引的结构十分紧凑,所以哈希查找的速度非常快 b. 限制:哈希索引只包含哈希值和指向哪一行的指针,并不储存字段值,所以不能直接取值而是根据指针去找值,不过访问内存中的行的速度很快,所以无大碍;哈希索引数据并不是按照索引值顺序排列储存的,所以无法用于排序;哈希索引不支持部分索引列匹配查找,比如在A, B两列上建立哈希索引,如果只用A列,则无法使用索引;哈希索引只支持等值比较查询,不支持任何范围查询;哈希冲突很多的话,删除一行就需要遍历对应哈希值得链表的每一行来找到并删除该行,维护操作的代价搞 c. InnoDB引擎有一个特殊功能“自适应哈希索引”,当引擎注意到某些索引值被使用得非常频繁时

Day 37 SQL基础(五)

牧云@^-^@ 提交于 2019-12-03 05:01:07
目录 事务处理 开始事务 回滚事务 提交事务 事务的特性 存储引擎 什么是存储引擎 各存储引擎的特性 概览 各种存储引擎的特性 各存储引擎的介绍 视图 创建视图 删除视图 修改视图 触发器 创建触发器 删除触发器 存储过程 创建无参存储过程 创建有参存储过程 执行存储过程 删除存储过程 SQL函数 事务处理 事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性 开始事务 start transaction 标识事务的开始 回滚事务 rollback 用来回退(撤销)SQL语句 select * from users; start transaction; update users set age = 18 where id = 120; delete from users where name = 'tiny'; rollback; select * from users; rollback只能在一个事务处理内使用,在执行一条start transaction命令之后 提交事务 commit 一般的MySQL语句都是直接针对数据库表执行和编写的.这就是所谓的隐含提交,即提交(写或保存)操作是自动进行的. 但是.在事务处理块中,提交不会隐含地进行.为进行明确的提交,使用commit语句 start transaction;

MySQL 创建唯一索引忽略对已经重复数据的检查

孤人 提交于 2019-12-03 04:48:54
MySQL 创建唯一索引忽略对已经重复数据的检查 在创建唯一索引的基础上加上关键字"IGNORE "即可。 # 重复数据 mysql> select aid,count(aid) as total ,email,tel_no,account_type,exten,passwd from fudao_admin group by user_name having total> 1; +-------+-------+--------------------------+--------+--------------+-------+----------------------------------+ | aid | total | email | tel_no | account_type | exten | passwd | +-------+-------+--------------------------+--------+--------------+-------+----------------------------------+ | 256 | 5 | | | 0 | | | | 4712 | 2 | bin.liu@wenba100.com | 0 | 0 | | 1afc079897c2de73022540f7c31db632 | | 1070 | 2 |

数据库事务【重点】、数据库单库备份、数据库多库备份、数据库全部备份、重新导入数据库文件

纵饮孤独 提交于 2019-12-03 04:47:00
day 05 数据库 1.pymysql 介绍: Python操作mysql的模块 安装: pip install mysql 连接: import pymysql conn = pymysql.connect(host='主机名', user='用户名', password='密码', database='数据库名',charset='utf8'); cursor = conn.cursor() ### 返回的是元祖套元祖 cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) ### 返回的是列表套字典 执行sql语句: cursor.execute(sql) 查: fetchall() : 获取多个, 返回 列表套字典 fetchone() : 获取一个, 返回 字典 fetchmany(size) : 获取size个数据, 返回的是 列表套字典 增删改: conn.commit() SQL注入: 原因: 太相信用户输入的数据 解决的方法: # sql = "select * from user where name='%s' and password='%s'" % (user, pwd) sql = "select * from user where name=%s and password=%s" cursor

MySQL--索引

六月ゝ 毕业季﹏ 提交于 2019-12-03 04:29:22
原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11777286.html MySQL--索引:   主键索引, 唯一索引, 普通索引, 组合索引 CREATE INDEX可以添加普通索引和唯一索引 创建一个名称为index_of_stu的表名为stu_user, 索引列为gender的普通索引 CREATE INDEX index_of_stu ON stu_user(gender); 创建一个名称为index_of_stu_name的表名为stu_user, 索引列为sname的唯一索引 CREATE UNIQUE INDEX index_of_stu_name ON stu_user(sname); ALTER可以添加普通索引,唯一索引,主键索引三种模式;而且参数列表可以有多个参数 新增一个普通索引 ALTER TABLE stu_user ADD INDEX index_add_one(sid); 新增一个唯一索引 ALTER TABLE stu_user ADD UNIQUE(sid,cid); 新增一个主键索引 ALTER TABLE stu_user ADD PRIMARY KEY(sname); 删除索引 DROP INDEX index_name_of_stu ON stu_user; 删除索引 ALTER

索引

泄露秘密 提交于 2019-12-03 04:29:08
python 操作 pymysql : ​ 安装 : pip install pymysql ​ pymysql : ​ -sql 注入问题 : 安全问题 产生原因 : 用户输入特殊字符 ,没有对用户输入做校验 import pymysql #连接数据库 conn = pymysql.connect( host = 'localhost',user ='root', password = '155',database = 'db1',charset = 'utf-8') cursor = conn.cursor() # 默认返回元组类型数据 user = input('enter to username: ').strip() pwd = input ('enter to passsword: ').strip() #输入sql指令 : sql = "from db1 where name = '%s' and password = '%s' " %(user,pwd) print(sql) #交互 res = cursor.execute(sql) print(res) cursor.close() #关闭连接 conn.close() if res: print('login sucessful') else: print('login bad') sql 注入问题 : 1

mysql数据库优化五步走

核能气质少年 提交于 2019-12-03 04:07:49
MySQL数据库 是一种小型关系型数据库管理系统,MySQL数据库的 优化 是MySQL数据库操作过程中非常重要的工作,MySQL数据库的优化能够实现MySQL数据库操作的简便。 第一步: 1:磁盘寻道能力,以高速硬盘(7200转/秒),理论上每秒寻道7200次.这是没有办法改变的,优化的方法是----用多个硬盘,或者把数据分散存储. 2:硬盘的读写速度,这个速度非常的快,这个更容易解决--可以从多个硬盘上并行读写. 3:cpu.cpu处理内存中的数据,当有相对内存较小的表时,这是最常见的限制因素. 4:内存的限制.当cpu需要超出适合cpu缓存的数据时,缓存的带宽就成了内存的一个瓶颈---不过现在内存大的惊人,一般不会出现这个问题. 第二步: (本人使用的是学校网站的linux平台(Linux ADVX.Mandrakesoft.com 2.4.3-19mdk )) 1:调节服务器参数 用shell>mysqld-help这个命令声厂一张所有mysql选项和可配置变量的表.输出以下信息: possible variables for option--set-variable(-o) are: back_log current value:5 //要求mysql能有的连接数量.back_log指出在mysql暂停接受连接的时间内有多少个连接请求可以被存在堆栈中 connect