mysql索引优化 mysiam和innodb区别?

Posted ~灵动奇迹~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql索引优化 mysiam和innodb区别?相关的知识,希望对你有一定的参考价值。

Mysql中有哪几种锁?

1.表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。

2.行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

3.页面锁:开销和加锁时尚界于表锁和行锁之间,并发度一般。

 

mysql中有哪些不同的表格? 5种

myisam、Heap、merge、innodb、isam

 

 

MYISAM和Innodb区别

myisam表引擎:

1.  5.1版本前,myisam是默认的存储引擎。

2. 支持全文索引,压缩空间函数。

3.不支持事务,但是每次查询都是原子的;不支持行锁,不支持外键,不支持崩溃后的安全恢复;

4.支持表锁,即每次操作是对整个表加锁;

5.每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。

6.用户在操作myisam表时,select,update,delete,insert语句都会给表自动加锁,如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。也可以通过lock table命令来锁表,这样操作主要是可以模仿事务,但是消耗非常大,一般只在实验演示中使用。

7.存储表的总行数;

8.采用非聚集索引,索引文件的数据域存储指向数据文件的指针。副索引与主索引基本一致,但是副索引不用保证唯一性。

 

Innodb表引擎:

1.默认事务引擎,最重要最广泛的存储引擎,性能非常优秀;

2.支持ACID的事务,支持事务的四种隔离级别;

3.支持行锁以及外键约束,因此可以支持写并发,采用MVCC多版本控制,来支持高并发;

4.不存储总行数;

5.所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB。

5.一个innodb引擎存储在一个文件空间(共享空间,表大小不受操作系统控制,一个表可以分布在多个文件里),也有可能为多个(设置为独立表空间,表大小受操作系统文件大小限制,一般为2G),受操作系统文件大小的限制。可以配置文件分开。

6.对主键查询的性能高于其他类型的存储引擎;主键索引采用聚簇索引(索引的数据域存储数据文件本身),副索引的数据域存储主键的值;因此从副索引查找数据,需要先通过副索引找到主键值,再访问副索引;最好使用自增主键,防止插入数据时,为维持B+树结构,文件的大调整。

7.内部做了很多优化,从磁盘读取数据时自动在内存构建hash索引,插入数据时自动构建插入缓冲区。

8.通过一些机制和工具支持真正的热备份。

9.支持崩溃后的安全恢复。

10.不支持全文索引;innodb聚簇索引比myisam非聚簇索引 快。

 

mysql中Innodb支持的四种事务隔离级别名称,以及逐级之间的区别?

sql标准定义的四个隔离级别:

1. read uncommited 读到未提交数据

2. read committed 脏读 ,不可重复读

3. repeatable read 可重复读 默认

4. serializable 串行事务

 

char 和 varchar的区别?

1.char 和 varchar 类型在存储和检索方面有所不同。

2.char列长度固定为创建表时声明的长度,长度值范围是1到255. (定长,根据定义的字符串长度分配足够的空间)

3.当char值被存储时,它们被用空格填充到特定长度,检索char值时需删除尾随空格。

4.适合存储很短的字符串,或者所有值都接近同一个长度。

5.char长度 超出设定的长度会被截断。

6.对于经常变更的数据,char比varchar更好,char不容易产生碎片。

对于非常短的列,char比varchar在存储空间上更有效率,只分配真正需要的空间,更长的列会消耗更多的内存。

 

主键和候选键有什么区别?

表格的每一行都由主键唯一标识,一个表只有一个主键。

主键也是候选键。按照惯例,候选键可以被指定为主键,并且可以用于任何外键引用。

 

表格定义的所有索引?

索引是通过以下方式为表格定义的: show index from <tablename>;

 

like声明中的 % 和 _  是什么意思?

%对应于0个或更多字符, _  只是like语句中的一个字符。 

 

如何在unix和mysql时间戳之间进行转换?

UNIX_TIMESTAMP是从mysql时间戳转换为unix时间戳的命令。

FROM_UNIXTIME是从时间戳转换为mysql时间戳的命令。

 

列对比运算符是什么?

在SELECT语句的列比较中使用 =,<>,<=,<,>=,>,<<,>>,<=>,AND,OR或like运算符。

 

BLOB和TEXT有什么区别?

1.尽量避免使用BLOB/text类型,查询会使用临时表,导致严重的性能开销。

2.BLOB是一个二进制对象,可以容纳可变数量的数据。 TEXT是一个不区分大小写的BLOB。

3.BLOB和TEXT类型之间的唯一区别在于对BLOB值进行排序和比较时,区分大小写,对TEXT值不区分大小写。

 

mysql_fetch_array 和 mysql_fetch_object 和 mysql_fetch_rows的区别是什么?

mysql_fetch_array()  将结果行作为关联数据或来自数据库的常规数据返回。

mysql_fetch_objetc()  从数据库返回结果行作为对象。

 

mysql 如何优化DISTINCT?  distinct

distinct在所有列上转换为group by,并与order by子句结合使用。

 

可以使用多少列创建索引?

最多可以创建16个索引列。

 

如果一个表有一列定义为TIMESTAMP,将发生什么?

每当行被更改时,时间戳字段将获取当前时间戳。

 

列设置为AUTO_INCREMENT时,如果在表中达到最大值,会发生什么情况?

会停止递增,任何进一步的插入都将产生错误,因为密钥已被使用。

 

怎样才能找出最后一次插入时分配了哪个自动增量?

LAST_INSERT_ID将返回由AUTO_INCREMENT分配的最后一个值,并且不需要指定表名称。

 

NOW() 和 CURRENT_DATE() 由什么区别?

NOW()命令用于显示当前年份,月份,日期,小时,分钟和秒。

CURRENT_DATE() 仅显示当前年份,月份和日期。

 

什么是非标准字符串类型?

1.TINYTEXT

2.TEXT

3.MEDIUMTEXT

4.LONGTEXT

 

什么是通用SQL函数?

1.CONCATAT(A,B)  连接两个字符串值以创建单个字符串输出。通常用于将两个或多个字段合并为一个字段。

2.FORMAT(X,D)  格式化数字X到D有效数字。

3.CURRDATE(), CURRTIME()  返回当前日期或时间

4.NOW()  将当前日期和时间作为一个值返回。

5.MONTH(), DAY(), YEAR(), WEEK(), WEEKDAY()  从日期值中提取给定数据。

6.HOUR(), MINUTE(), SECOND()   从时间值中提取给定数据。

7.DATEDIFF(A,B)  确定两个日期之间的差异,通常用于计算年龄。

8.SUBTIMES(A,B)   确定两次之间的差异。

9.FEOMDAYS(INT)   将整数天数转换为日期值。

 

mysql支持事务吗?

在缺省模式下,mysql是autocommit模式的,所有的数据库更新操作都会及时提交,所以在缺省情况下,mysql是不支持事务的。

但是如果你的mysql表类型是使用innodb tables 或BDB tables的话,你的mysql就可以使用事务处理,使用set autocommit模式,在非autocommit模式下,你必须使用commit来提交你的更改,或者用rollback来回滚你的更改。

 

mysql里记录货币用什么字段类型好?

NUMERIC和DECIMAL类型被mysql实现为同样的类型,这在SQL92标准允许。他们被用于保存值,该值的准确精度是极其重要的值,

例如与金钱有关数据。当声明一个类是这些类型之一时,精度和规模的能被(并且通常是)指定。

例如:salary  decimal(9,2);

在这个例子中,9(precision)代表将被用于存储值的总得小数位数,而2(scale)代表将被用于存储小数点后的位数。

因此,在这种情况下,能被存储在salary列中的值得范围是从-9999999.99到9999999.99.

 

mysql有关权限的表有哪几个?

mysql服务器通过权限表来控制用户对数据库的访问,权限表存放在mysql数据库里,由mysql_install_db脚本初始化。这些权限表分别user,db,table_priv,columns_priv和host。

 

列的字符串类型可以是什么?

set    blob  enum   char   text

mysql数据库做发布系统的存储,数据量增大的情况,怎么优化?

1.设计良好的数据库结构,允许部分数据冗余,尽量避免join查询,提高效率。

2.选择合适的表字段数据类型和存储引擎,适当的添加索引。

3.mysql库主从读写分离。

4.找规律分表,减少单表中的数据量提高查询速度。

5.添加缓存机制,比如memcached,apc等。

6.不经常改动的页面,生成静态页面。

7.书写高效率的sql.

 

锁的优化策略:

1.读写分离

2.分段加锁

3.减少锁持有的时间

4.多个线程尽量以相同的顺序去获取资源。

不能将锁的粒度过于细化,不然可能会出现线程的加锁和释放次数过多,反而效率不如一次加一把大锁。

 

索引的底层实现原理和优化:

B+树    经过优化的B+树

主要是在所有的叶子结点中增加了指向下一个叶子节点的指针,因此innodb 建议为大部分表使用默认自增的主键作为主索引。

 

什么情况下设置了索引但无法使用:

1.以 % 开头的like语句,模糊匹配; int 类型 like 不匹配。

2. or语句前后没有同时使用索引。

3.数据类型出现隐士转化(如varchar不加单引号的话可能会自动转换为int型)。

4.不等于 或 not  null 

 

实践中如何优化mysql:

1.sql 语句以及索引的优化。

2.数据库表结构的优化。

3.系统配置的优化。

4.硬件的优化。

 

优化数据库的方法:

1.选取最适用的字段属性,尽可能减少定义字段宽度,尽量把字段设置not null,例如 省份、性别 最好适应enum.

2.使用连接join来代替子查询。

3.适用联合union来代替手动创建的临时表

4.事务处理

5.锁定表、优化事务处理

6.使用外键,优化锁定表

7.建立索引。

8.优化查询语句

 

简单描述mysql中,索引 ,主键,唯一索引,联合索引的区别,对数据库的性能有什么影响(从读写两方面)?

索引是一种特殊的文件(innodb数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。

普通索引(由关键字key或index定义的索引)的唯一任务是加快对数据的访问速度。

 

普通索引允许被索引的数据列包含重复的值,如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字unique把它定义为一个唯一索引。也就是说,唯一索引可以保证数据记录的唯一性。

 

主键:是一种特殊的唯一索引,在一张表中只能定义一个主键索引,主键用于唯一标识一条记录,使用关键字primary key来创建。

 

索引可以覆盖多个数据列,如像index(columnA,columnB)索引,这就是联合索引。

 

索引可以极大的提高数据的查询速度,但是会降低插入、删除、更新表的速度,因为在执行这些写操作时,还要操作索引文件。

 

数据库中的事务是什么?

事务(transaction)是作为一个单元的一组有序的数据库操作。如果组中的所有操作都成功,则认为事务成功,即使只有一个操作失败,事务也不成功。如果所有操作完成,事务则提交,其修改将作用于所有其他数据库进程。如果一个操作失败,则事务将回滚,该事务所有操作的影响都将取消。

 

事务特性:

1.原子性:即不可分割性,事务要么全部被执行,要么就全部不被执行。

2.一致性或可串行:事务的执行使得数据库从一种正确状态转换成另一种正确状态。

3.隔离性:在事务正确提交之前,不允许把该事务对数据的任何改变提供任何其他事务。

4.持久性:事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故障,事务的处理结果也会得到保存。

事务就是被绑定在一起作为一个逻辑工作单元的SQL语句分组,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,

 

以上是关于mysql索引优化 mysiam和innodb区别?的主要内容,如果未能解决你的问题,请参考以下文章

MySIAM与Innodb引擎

Innodb和Mysiam引擎的区别

mysql innodb和myisam哪个查询速度快

MyIsam与InnoDB的区别

Mysql优化简绍一

MySQL 统计信息