mysql创建索引

MySQL当批量插入遇上唯一索引

最后都变了- 提交于 2019-12-03 21:22:16
一、 背景 以前使用SQL Server进行表分区的时候就碰到很多关于唯一索引的问题: Step8:SQL Server 当表分区遇上唯一约束 ,没想到在MySQL的分区中一样会遇到这样的问题: MySQL表分区实战 。 今天我们来了解MySQL唯一索引的一些知识:包括如何创建,如何批量插入,还有一些技巧上SQL; 这些问题的根源在什么地方?有什么共同点?MySQL中也有分区对齐的概念?唯一索引是在很多系统中都会出现的要求,有什么办法可以避免?它对性能的影响有多大? 二、 过程 (一) 导入差异数据,忽略重复数据,IGNORE INTO的使用 在MySQL创建表的时候,我们通常创建一个表的时候是以一个自增ID值作为主键,那么MySQL就会以PRIMARY KEY作为聚集索引键和主键,既然是主键,那当然是唯一的了,所以重复执行下面的插入语句会报1062错误:如Figure1所示; -- 创建测试表 CREATE TABLE `testtable` ( `Id` INT ( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT, `UserId` INT ( 11 ) DEFAULT NULL , `UserName` VARCHAR ( 10 ) DEFAULT NULL , `UserType` INT ( 11 ) DEFAULT NULL ,

MySQL数据库优化

狂风中的少年 提交于 2019-12-03 17:36:01
背景 “那啥,你过来一下!” “怎么了?我代码都单元测试了的,没出问题啊!”我一脸懵逼跑到运维大佬旁边。 “你看看!你看看!多少条报警,赶快优化一下!” 运维大佬短信列表里面好多MySQL CPU 100%报警短信。再看看项目名称不就是我前几天刚发布的项目吗!? 我心底一沉,赶快赔上笑脸。“这个一定优化,马上优化!那个,能不能看下数据库监控日志…” 运维大佬又数落了我几句,然后调开了数据库监控日志。 那家伙…每秒300多的连接数,几乎快要封顶的全表扫描数,还有大红色CPU警报。。。 “那个,能不能看看nginx访问日志…我看下访问量…”我弱弱地说到。 运维大佬不情愿的跑了下下面的语句: grep -c come access.log Shell come这个接口是其中一个请求量比较大的接口,结果是600多万。那个时候才中午,周末高峰期估计一天得有上千万吧! 我撇了撇嘴,心里想着这么高的请求量,当初那么抠门只给我一台低配数据库还好意思说,不过嘴上肯定是:“好好好,请求量不是很大,看来是数据库问题,我立刻去优化一下!” “给它弄一个读写分离不就行了吗!?”这时另外一个运维大佬凑了过来,随意地挥了挥手。。。 你问我DBA去哪儿了?DBA当时有点忙,只说让我自己检查一下。。。 优化思路 我这个项目由于上线之前比较赶,所以前期并没有管数据库设计方面的一些问题,如今随着游戏接入

聚簇索引和非聚簇索引

情到浓时终转凉″ 提交于 2019-12-03 17:35:55
总结: InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,聚簇索引就是按照每张表的主键构造一颗B+树,同时叶子节点中存放的就是整张表的行记录数据,也将聚集索引的叶子节点称为数据页。这个特性决定了索引组织表中数据也是索引的一部分;   一般建表会用一个自增主键做 聚簇索引,没有的话MySQL会默认创建,但是这个主键如果更改代价较高,故建表时要考虑自增ID不能频繁update这点。   我们日常工作中,根据实际情况自行添加的索引都是辅助索引,辅助索引就是一个为了需找主键索引的二级索引,现在找到主键索引再通过主键索引找数据; 本文链接:https://blog.csdn.net/lm1060891265/article/details/81482136 参考博客:http://www.admin10000.com/document/5372.html 聚簇索引并不是一种单独的索引类型,而 是一种数据存储方式 。具体细节依赖于其实现方式。 MySQL数据库中innodb存储引擎,B+树索引可以分为聚簇索引(也称聚集索引,clustered index)和辅助索引(有时也称非聚簇索引或二级索引,secondary index,non-clustered index)。这两种索引内部都是B+树,聚集索引的叶子节点存放着一整行的数据。 Innobd中的主键索引是一种聚簇索引

mysql 8.3优化和索引

穿精又带淫゛_ 提交于 2019-12-03 17:28:16
MySQL如何使用索引 索引用于快速查找具有特定列值的行。 没有索引,MySQL必须从第一行开始,然后通读整个表以找到相关的行。 桌子越大,花费越多。 如果表中有相关​​列的索引,MySQL可以快速确定要在数据文件中间查找的位置,而不必查看所有数据。 这比顺序读取每一行要快得多。 大多数MySQL索引( PRIMARY KEY , UNIQUE , INDEX 和 FULLTEXT )存储在 B树 。 例外:空间数据类型的索引使用R树; MEMORY 表还支持 哈希索引 ; InnoDB 对 FULLTEXT 索引 使用倒排列表 。 通常,如以下讨论中所述使用索引。 第8.3.8节“ B树和哈希索引的比较” MEMORY 中介绍了 哈希索引特有的特性(如 表中所 用 ) 。 MySQL使用索引进行以下操作: WHERE 快速 查找与 子句 匹配的行 。 从考虑中消除行。 如果可以在多个索引之间进行选择,MySQL通常会使用找到最少行数的 索引 (最具 选择性的 索引)。 如果表具有多列索引,则优化器可以使用索引的任何最左前缀来查找行。 例如,如果你有一个三列索引上 (col1, col2, col3) ,你有索引的搜索功能 (col1) , (col1, col2) 以及 (col1, col2, col3) 。 有关更多信息,请参见 第8.3.5节“多列索引” 。

SQL 创建表

坚强是说给别人听的谎言 提交于 2019-12-03 15:46:57
SQL 创建表是通过SQL CREATE TABLE 语句来实现,该语句是DDL SQL语句 。CREATE TABLE语句用于创建用于存储数据的表。在创建表时,可以为列定义主键、惟一键和外键等完整性约束。完整性约束可以在列级或表级定义。对于不同的RDBMS, CREATE语句的实现和语法是不同的。 CREATE TABLE语句语法 CREATE TABLE table_name (column_name1 datatype, column_name2 datatype,... column_nameN datatype); SQL table_name—是表的名称 column_name1, column_name2 ….-是列的名称 datatype -是列的数据类型,比如char、date、number等 例如:如果要创建employee表,语句应该是这样的: CREATE TABLE employee ( id number(5), name char(20), dept char(10), age number(2), salary number(10), location char(10)); SQL 在Oracle数据库中,整数列的数据类型表示为“number”。在Sybase中,它表示为“int”。 Oracle提供了另一种创建表的方法。 CREATE TABLE

SQL 查询 SELECT

℡╲_俬逩灬. 提交于 2019-12-03 15:46:44
SQL 查询是通过SELECT SQL 语句 来完成的。SELECT可以说是SQL中最常用的语句了。你可以把SQL语句看作是英语语句,SELECT就是SQL中的关键字之一,除了SELECT之外,还有INSERT、DELETE、UPDATE等关键字,这些关键字是SQL的保留字,这样可以很方便地帮助我们分析理解SQL语句。我们在定义数据库表名、字段名和变量名时,要尽量避免使用这些保留字。 SELECT的作用是从一个表或多个表中检索出想要的数据行。本文极客教程主要讲解SELECT的基础查询,后面极客教程会介绍如何通过多个表的连接操作进行复杂的查询。 SELECT查询的基础语法 SELECT可以帮助我们从一个表或多个表中进行数据查询。我们知道一个数据表是由列(字段名)和行(数据行)组成的,我们要返回满足条件的数据行,就需要在SELECT后面加上我们想要查询的列名,可以是一列,也可以是多个列。如果你不知道所有列名都有什么,也可以检索所有列。 创建了一个王者荣耀英雄数据表,这张表里一共有69个英雄,23个属性值(不包括英雄名name)。SQL文件见 Github地址 。 数据表中这24个字段(除了id以外),分别代表的含义见下图。 查询列 如果我们想要对数据表中的某一列进行检索,在SELECT后面加上这个列的字段名即可。比如我们想要检索数据表中都有哪些英雄。 SELECT name FROM

Mysql的数据库引擎

烈酒焚心 提交于 2019-12-03 15:02:37
Mysql的数据库引擎 Mysql的逻辑分层 连接层-->服务层--->引擎层--->存储层 什么是数据库引擎 数据库引擎是用于存储、处理和保护数据的核心服务。 当你访问数据库时,不管是手工访问,还是程序访问,都不是直接读写数据库文件,而是通过数据库引擎去访问数据库文件 注意:数据引擎是指表格中的引擎, 数据库引擎innodb与myisam区别 是否支持事务 InnoDB支持事务 对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin transaction和commit之间,组成一个事务; MyISAM不支持, 支持锁的级别不同 InnoDB支持行锁 注意:数据库的主键和索引对锁是有影响的。 在使用for update的时候,在明确使用主键或者索引的时候才会是行锁,否则就是表锁。 MyISAM只支持表锁 是否支持外键 InnoDB支持外键 MyISAM不支持。 对一个包含外键的InnoDB表转为MYISAM会失败; 存放索引的方式 InnoDB是聚集索引, 数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。 因此,主键不应该过大,因为主键太大,其他索引也都会很大。 MyISAM是非聚集索引,数据文件是分离的, 索引保存的是数据文件的指针

MYSQL补充

余生颓废 提交于 2019-12-03 14:55:30
1、视图 视图当作表 2、触发器 insert ... 3、存储过程 insert into tb1() update tb2... 事务:innodb p12(out status int): try: insert into tb1() update tb2... set status=1 except ...: set status=0 call p12() 4、函数 def func(arg): return arg + 100 select nid from student # 1,2,3,4,5,6... select func(nid) from student # 101,102,103,104 select func(1) # 101 函数: mysql内置函数 自定义函数 函数: SQL不允许 declare a int; # set a = 123; select nid into a from student where name='alex' # nid: 11 name:alex # a = 11 return 返回 # select 函数名(参数) 存储过程: sql语句 intout,out构造返回值 call: 存储过程名称 索引 功能: - 约束 - 主键 - 外键 - 唯一 - 普通 - 组合 - 加速查找 为什么索引可以这么快?

day36

a 夏天 提交于 2019-12-03 14:18:49
一、python操作mysql pymysql的安装 pip install pymysql sql注入问题 产生的原因 因为过于相信用户输入的内容,根本没有做任何的检验 解决的方法 sql = "select * from user where 字段1=%s and 字段2=%s" cursor.execute(sql, (值1, 值2)) 连接 连接数据库的参数 conn=pymysql.connect(host='localhost',user='root',password='123qwe',database='test',charset='utf8') cursor = conn.cursor() ### 默认返回的值是元祖类型 cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) ### 返回的值是字典类型 (*********) 增 设定sql语句 sql = sql增加数据语句 设定要加入的数据 data = [(),(),()...] 执行到数据库中 cursor.executemany(sql,data) 提交 conn.commit() 查 fetchall() : 取出所有的数据 返回的是列表套字典 fetchone() : 取出一条数据 返回的是字典 fetchmany(size) :

宜信的105条数据库军规

ⅰ亾dé卋堺 提交于 2019-12-03 13:40:59
作为一家金融科技企业,宜信的大量业务都依赖于数据库。如何提高公司整体数据库应用水平,是对DBA的一大挑战,也非常具有现实意义。笔者在宜信的多年工作中,与团队一起总结整理了针对传统关系型数据库的使用规则,并借助自研的数据库审核平台落地,借此帮助研发团队评估数据库开发质量,达到尽早发现问题、解决问题之目的。下图正是这一系统的简单原理图。 如上图所示,针对规则部分又可细分为如下分类(部分)。简单描述如下,后面将逐一详细说明。 一、Oracle规则(对象) 1.1 表、分区 【规则1】 规则说明:超过指定规模且没有分区的表。 规则阈值:2GB(物理大小超过指定阀值)。 规则描述:表的规模过大,将影响表的访问效率、增加维护成本等。常见的解决方案就是使用分区表,将大表转换为分区表。 【规则2】 规则说明:单表或单分区记录数量过大。 规则阈值:1000000(单表或单分区记录数超过指定阀值)。 规则描述:控制单个表或单个分区的数据规模,提高单一对象的访问效率。如记录数过多,应考虑分库、分表、分区等策略。 【规则3】 规则说明:大表过多。 规则阈值:自定义(超过2G的表的数量过多)。 规则描述:大表在所有表中所占比例超过20%(OLTP)或95%(OLAP)。 【规则4】 规则说明:单表分区数量过多。 规则阈值:500(单表分区数量超过指定阀值)。 规则描述:分区表中分区数量过多